Skip to content
Snippets Groups Projects
Commit 71156027 authored by Jakub Konvička's avatar Jakub Konvička
Browse files

feat(#25): Increase quality to assure

parent 0aaf764a
2 merge requests!15merge: develop into main,!14Increase code quality
Pipeline #876 passed with stages
in 1 minute and 39 seconds
Showing
with 213 additions and 417 deletions
......@@ -2,8 +2,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LanguageRecogniser", "LanguageRecogniser\LanguageRecogniser.csproj", "{2BD73347-D038-4F3F-B501-3A03E370A039}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{F1BD59D1-4426-41A6-9124-29FBEFDF02B8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiagramBuilder", "DiagramBuilder\DiagramBuilder.csproj", "{6A820208-ABA7-4998-B1A9-F35F55712D54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Database", "Database\Database.csproj", "{69FC607B-18F4-407B-B9A1-22F7C9961A0B}"
......@@ -22,10 +20,6 @@ Global
{2BD73347-D038-4F3F-B501-3A03E370A039}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2BD73347-D038-4F3F-B501-3A03E370A039}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2BD73347-D038-4F3F-B501-3A03E370A039}.Release|Any CPU.Build.0 = Release|Any CPU
{F1BD59D1-4426-41A6-9124-29FBEFDF02B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1BD59D1-4426-41A6-9124-29FBEFDF02B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F1BD59D1-4426-41A6-9124-29FBEFDF02B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F1BD59D1-4426-41A6-9124-29FBEFDF02B8}.Release|Any CPU.Build.0 = Release|Any CPU
{6A820208-ABA7-4998-B1A9-F35F55712D54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6A820208-ABA7-4998-B1A9-F35F55712D54}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6A820208-ABA7-4998-B1A9-F35F55712D54}.Release|Any CPU.ActiveCfg = Release|Any CPU
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Database\Database.csproj" />
<ProjectReference Include="..\DiagramBuilder\DiagramBuilder.csproj" />
<ProjectReference Include="..\LanguageRecogniser\LanguageRecogniser.csproj" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Input\Example1.cpp" />
</ItemGroup>
</Project>
#include <iostream>
#include <vector>
#define E 1
namespace DatabaseModel
{
int main() {
int cislo = E;
printf("Ahoj, zadej cislo: ");
scanf_s("%d", &cislo);
if(cislo == 0)
{
printf("Cislo je nula");
while(cislo == 0)
{
printf("Zadej cislo: ");
scanf_s("%d", &cislo);
}
}
else
{
int a = 5;
int b = 6;
int c = a + b;
printf(" %d + %d = %d", a, b, c);
}
return;
}
}
\ No newline at end of file
using Antlr4.Runtime;
using Antlr4.Runtime.Tree;
using CodeParser.Cpp;
using Database;
using Database.Model;
using DiagramBuilder.Activity.Diagram.Enum;
using DiagramBuilder.Class.Interface;
using DiagramBuilder.ConcreteCreator;
/*ActivityDiagramBuilderBuilderCreator activityDiagramBuilderCreator = new ActivityDiagramBuilderBuilderCreator();
IDiagramBuilder diagramBuilder = activityDiagramBuilderCreator.FactoryMethod("ActivityDiagram");
IPackageBuilder packageBuilder = diagramBuilder.AddPackage("package1");
//generate test classses with associations and operations and attributes
packageBuilder.AddClass("Class1", false)
.AddProperty("property1", VisibilityType.Private, PropertyType.PrimitiveTypeBoolean)
.AddProperty("property2", VisibilityType.Public, PropertyType.PrimitiveTypeInteger)
.AddProperty("property3", VisibilityType.Protected, PropertyType.PrimitiveTypeString)
.AddOperation("Operation1", VisibilityType.Private)
.AddOperation("Operation2", VisibilityType.Public)
.AddOperation("Operation3", VisibilityType.Protected)
.AddAssociation("Class2", VisibilityType.Public, AssociationType.Association)
.AddAssociation("Class2", VisibilityType.Public, AssociationType.Aggregation)
.AddAssociation("Class2", VisibilityType.Public, AssociationType.Composition);
packageBuilder.AddClass("Class2", false)
.AddProperty("property1", VisibilityType.Private, PropertyType.PrimitiveTypeBoolean)
.AddOperation("Operation1", VisibilityType.Private)
.AddGeneralization("Class1");
packageBuilder.AddClass("Class3", false)
.AddProperty("property1", VisibilityType.Private, PropertyType.PrimitiveTypeBoolean)
.AddOperation("Operation1", VisibilityType.Protected)
.AddGeneralization("Class1");
Console.WriteLine(diagramBuilder.BuildDiagram());*/
//load c++ code from file Example1.cpp
string inputCode = System.IO.File.ReadAllText(@"../../../Input/Example1.cpp");
// Create a lexer and parser for the C++ code
var inputStream = new AntlrInputStream(inputCode);
/*var lexer = new CPP14Lexer(inputStream);
var commonTokenStream = new CommonTokenStream(lexer);
var parser = new CPP14Parser(commonTokenStream);
ActivityDiagramBuilderBuilderCreator activityDiagramBuilderCreator = new ActivityDiagramBuilderBuilderCreator();
IDiagramBuilder diagramBuilder = activityDiagramBuilderCreator.FactoryMethod("ActivityDiagram");*/
// Create your custom listener
/*var listener = new CppClassDiagramListener(diagramBuilder);
// Attach the custom listener to the parser
parser.AddParseListener(listener);
// Start parsing the C++ code using the appropriate entry point
var translationUnitContext = parser.translationUnit(); // Use the correct entry point
// Your custom listener will handle events and process the code
Console.WriteLine("Parsing Complete!");
//Console.WriteLine(diagramBuilder.BuildDiagram());*/
ActivityDiagramBuilderCreatorFactory activityDiagramBuilderCreator = new ActivityDiagramBuilderCreatorFactory();
DiagramBuilder.Activity.Interface.IDiagramBuilder diagramBuilder = activityDiagramBuilderCreator.FactoryMethod("ActivityDiagram");
diagramBuilder
.AddLoop("test", "cond")
.AddDecision("D1", "t","f")
.AddLoop("test2", "cond2", BranchType.True)
.AddAction("a", BranchType.True)
.CloseLoop("loopCLose", BranchType.True)
.AddMerge("merge")
.CloseLoop("a")
.AddAction("c");
var xmi = diagramBuilder.BuildDiagram();
Console.WriteLine(xmi);
File.WriteAllText("/Users/jakubkonvicka/Applications/EA.app/Contents/SharedSupport/prefix/drive_c/xmi/activity.xml", xmi);
//visitor
/*
var lexer = new CPP14Lexer(inputStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
CPP14Parser parser = new CPP14Parser(tokens);
ClassClassDiagramBuilderBuilderCreator classClassDiagramBuilderCreator = new ClassClassDiagramBuilderBuilderCreator();
IDiagramBuilder diagramBuilder = classClassDiagramBuilderCreator.FactoryMethod("ActivityDiagram");
IParseTree tree = parser.namespaceDefinition();
if (parser.NumberOfSyntaxErrors == 0)
{
CppClassDiagramVisitor classDiagramVisitor = new CppClassDiagramVisitor(diagramBuilder);
Console.WriteLine(classDiagramVisitor.Visit(tree));
}
var xmi = diagramBuilder.BuildDiagram();
Console.WriteLine(xmi);
File.WriteAllText("/Users/jakubkonvicka/Library/Application Support/CrossOver/Bottles/Enterprise Architect 16.x/drive_c/xmi/ActivityDiagram.xmi", xmi);
*/
......@@ -18,8 +18,8 @@ public class DatabaseContext : DbContext
DbPath = System.IO.Path.Join(path, "database.db");
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={DbPath}");
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlite($"Data Source={DbPath}");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
......
......@@ -28,9 +28,9 @@ namespace DiagramBuilder.Activity.Diagram
_lastAddedNode.Add(new Dictionary<BranchType, XmiElement>());
_lastBranchTypeForDecision.Add(BranchType.True);
_lastAddedEdge.Last().Add(BranchType.True, trueBranchEdge);
_lastAddedNode.Last().Add(BranchType.True, lastAddedNode);
_lastAddedNode.Last().Add(BranchType.False, lastAddedNode);
_lastAddedEdge[^1].Add(BranchType.True, trueBranchEdge);
_lastAddedEdge[^1].Add(BranchType.True, lastAddedNode);
_lastAddedEdge[^1].Add(BranchType.False, lastAddedNode);
}
public string? BuildDiagram()
......@@ -43,54 +43,36 @@ namespace DiagramBuilder.Activity.Diagram
public IDecisionBuilder AddAction(string name, BranchType type)
{
XmiElement node;
if (!_lastAddedEdge.Last().TryGetValue(type, out var edge))
if (!_lastAddedEdge[^1].TryGetValue(type, out var edge))
{
node = _xmiActivityDiagramUmlBuilder.AddAction(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode.Last()[type]);
_lastAddedEdge.Last().Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge);
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[^1][type]);
_lastAddedEdge[^1].Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge);
}
else
{
node = _xmiActivityDiagramUmlBuilder.AddAction(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge.Last()[type] }, null, _lastAddedNode.Last()[type]);
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
}
_lastAddedNode.Last()[type] = node;
_lastAddedNode[^1][type] = node;
return this;
}
private void AddLabeledEdge(BranchType type)
{
if (type is BranchType.True)
{
_xmiActivityDiagramUmlBuilder.AddLabel(_lastAddedEdge.Last()[type], "true");
}
else if(type is BranchType.False)
{
_xmiActivityDiagramUmlBuilder.AddLabel(_lastAddedEdge.Last()[type], "false");
}
}
public IDiagramBuilder AddAction(string name)
{
this._diagramBuilder.AddAction(name);
return this._diagramBuilder;
}
public IDecisionBuilder AddMerge(string? name)
{
var mergeNode = _xmiActivityDiagramUmlBuilder.AddMerge(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
_lastAddedNode.Last()[BranchType.True], _lastAddedNode.Last()[BranchType.False]);
_lastAddedEdge.Remove(_lastAddedEdge.Last());
_lastAddedNode.Remove(_lastAddedNode.Last());
_lastAddedNode[^1][BranchType.True], _lastAddedNode[^1][BranchType.False]);
_lastAddedEdge.Remove(_lastAddedEdge[^1]);
_lastAddedNode.Remove(_lastAddedNode[^1]);
this._diagramBuilder.LastActivity = mergeNode;
if (_lastAddedNode.Count == 0)
return this;
_lastAddedNode.Last()[_lastBranchTypeForDecision.Last()] = mergeNode;
_lastAddedNode[^1][_lastBranchTypeForDecision[^1]] = mergeNode;
_lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count-1);
return this;
......@@ -106,7 +88,7 @@ namespace DiagramBuilder.Activity.Diagram
{
node = _xmiActivityDiagramUmlBuilder.AddDecision(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[_lastAddedNode.Count-2][type]);
_lastAddedEdge.Last()[type] = _xmiActivityDiagramUmlBuilder.LatestEdge;
_lastAddedEdge[^1][type] = _xmiActivityDiagramUmlBuilder.LatestEdge;
}
else
{
......@@ -116,39 +98,38 @@ namespace DiagramBuilder.Activity.Diagram
}
node.Type = XmiType.UmlDecisionNode;
_lastAddedNode.Last().Add(BranchType.True, node);
_lastAddedNode.Last().Add(BranchType.False, node);
//_lastAddedEdge.Last().Add(BranchType.False, _xmiActivityDiagramUmlBuilder.LatestEdge);
_lastAddedNode[^1].Add(BranchType.True, node);
_lastAddedNode[^1].Add(BranchType.False, node);
return this;
}
public IDecisionBuilder AddLoop(string name, string condition, BranchType type)
{
if (!_lastAddedEdge.Last().TryGetValue(type, out var edge))
if (!_lastAddedEdge[^1].TryGetValue(type, out var edge))
{
_lastAddedNode.Last()[type] = _xmiActivityDiagramUmlBuilder.AddDecision(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode.Last()[type]);
_lastAddedEdge.Last().Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge);
_lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[^1][type]);
_lastAddedEdge[^1].Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge);
}
else
{
_lastAddedNode.Last()[type] = _xmiActivityDiagramUmlBuilder.AddDecision(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge.Last()[type] }, null, _lastAddedNode.Last()[type]);
_lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
}
_loopElements.Add(new Dictionary<BranchType, XmiElement>());
_loopElements.Last().Add(type, _lastAddedNode.Last()[type]);
_loopElements[^1].Add(type, _lastAddedNode[^1][type]);
return this;
}
public IDecisionBuilder CloseLoop(string name, BranchType type)
{
_xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram, _lastAddedNode.Last()[type],
_loopElements.Last()[type]);
_lastAddedNode.Last()[type] = _loopElements.Last()[type];
_loopElements.Remove(_loopElements.Last());
_xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram, _lastAddedNode[^1][type],
_loopElements[^1][type]);
_lastAddedNode[^1][type] = _loopElements[^1][type];
_loopElements.Remove(_loopElements[^1]);
return this;
}
......
......@@ -5,7 +5,7 @@ namespace DiagramBuilder.Activity.XML;
public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
{
private List<XmiElement> _decisionBlocks = new List<XmiElement>();
private readonly List<XmiElement> _decisionBlocks = new List<XmiElement>();
private XmiElement _lastAddedNodeElement { get; set; } = null;
public XmiElement ActivityDiagram { get; set; }
......@@ -25,14 +25,12 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
private XmiElement AddActivityDiagram(XmiElement parent, string? name)
{
string? id = name;
var activityDiagram = AddPackagedElement(parent, XmiType.UmlActivity, name, null);
return activityDiagram;
}
public XmiElement AddInitialNode(XmiElement parent, string name)
{
string id = name;
Guid guid = Guid.NewGuid();
var initialNode = AddNode(parent, XmiType.UmlInitialNode, guid, name, null);
return initialNode;
......@@ -65,32 +63,13 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
public XmiElement AddMerge(XmiElement parent, string? name, XmiElement lastTrueBranchNode, XmiElement lastFalseBranchNode)
{
string? id = name;
_lastAddedNodeElement = AddMergeNode(parent, name, lastTrueBranchNode, lastFalseBranchNode);
_nodes.Add(_lastAddedNodeElement.XmlElement.GetAttribute("xmi:id"), _lastAddedNodeElement);
/*
if (edgesIncomming != null)
{
foreach (var edge in edgesIncomming)
{
AddIncomming(merge, edge);
}
}
if (edgesOutgoing != null)
{
foreach (var edge in edgesOutgoing)
{
AddOutgoing(merge, edge);
}
}
*/
return _lastAddedNodeElement;
}
public XmiElement AddAction(XmiElement parent, string name, List<XmiElement> edgesIncomming, List<XmiElement> edgesOutgoing, XmiElement decisionBlock = null)
{
string id = name;
Guid guid = Guid.NewGuid();
var activity = AddNode(parent, XmiType.UmlAction, guid, name, null, decisionBlock);
if(edgesIncomming is null)
......@@ -119,7 +98,7 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
public void AddDirectedEdge(XmiElement parent, XmiElement source, XmiElement target)
{
AddEdge(parent, XmiType.UmlControlFlow, source, target);
AddEdge(parent, source, target);
}
public void AddLabel(XmiElement edge, string label)
......@@ -127,7 +106,7 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
AddEdgeLabel(edge, label);
}
private XmiElement AddActivityFinalNode(XmiElement parent, string name, XmiElement lastClosedDecision)
private void AddActivityFinalNode(XmiElement parent, string name, XmiElement lastClosedDecision)
{
Guid guid = Guid.NewGuid();
var activityFinalNode = AddNode(parent, XmiType.UmlActivityFinalNode, guid, name, null, lastClosedDecision);
......@@ -141,37 +120,34 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
continue;
}
var edge = AddEdge(ActivityDiagram, XmiType.UmlControlFlow, node.Value, activityFinalNode, true);
var edge = AddEdge(ActivityDiagram, node.Value, activityFinalNode, true);
AddIncomming(activityFinalNode, edge);
}
return activityFinalNode;
}
private XmiElement AddPackage(XmiElement parent, string? name)
{
string? id = name;
var package = AddPackagedElement(parent, XmiType.UmlPackage, name, null);
return package;
}
private XmiElement AddPackagedElement(XmiElement parent, XmiType xmiType, string? name, List<XmiAttributeDTO>? additionalAttributes)
private XmiElement AddPackagedElement(XmiElement parent, XmiType xmiType, string? name, List<XmiAttributeDto>? additionalAttributes)
{
return _xmiBuilder.AddElement(parent, "packagedElement", xmiType, name, additionalAttributes);
}
private XmiElement AddEdge(XmiElement parent, XmiType xmiType, XmiElement source, XmiElement target, bool allowNameReturn = false)
private XmiElement AddEdge(XmiElement parent, XmiElement source, XmiElement target, bool allowNameReturn = false)
{
//create source target attributes
var additionalAttributes = new List<XmiAttributeDTO>()
var additionalAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "",
AttributeName = "source",
AttributeValue = source.XmlElement.GetAttribute("xmi:id"),
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "",
AttributeName = "target",
......@@ -193,17 +169,17 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
private XmiElement AddMergeNode(XmiElement parent, string? name, XmiElement lastTrueBranchNode, XmiElement lastFalseBranchNode)
{
var node = _xmiBuilder.AddElement(parent, "node", XmiType.UmlMergeNode, name, null);
AddEdge(ActivityDiagram, XmiType.UmlControlFlow, lastTrueBranchNode, node);
AddEdge(ActivityDiagram, XmiType.UmlControlFlow, lastFalseBranchNode, node);
AddEdge(ActivityDiagram, lastTrueBranchNode, node);
AddEdge(ActivityDiagram, lastFalseBranchNode, node);
return node;
}
private XmiElement AddNode(XmiElement parent, XmiType xmiType, Guid guid, string name, List<XmiAttributeDTO>? additionalAttributes, XmiElement decisionBlock = null)
private XmiElement AddNode(XmiElement parent, XmiType xmiType, Guid guid, string name, List<XmiAttributeDto>? additionalAttributes, XmiElement decisionBlock = null)
{
if (_lastAddedNodeElement != null && xmiType != XmiType.UmlMergeNode)
{
var node = _xmiBuilder.AddElement(parent, "node", xmiType, guid.ToString(), name, additionalAttributes);
AddEdge(ActivityDiagram, XmiType.UmlControlFlow, decisionBlock is null ? _lastAddedNodeElement : decisionBlock, node);
AddEdge(ActivityDiagram, decisionBlock is null ? _lastAddedNodeElement : decisionBlock, node);
_lastAddedNodeElement = node;
}
else
......@@ -215,46 +191,46 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
return _lastAddedNodeElement;
}
private XmiElement AddEdgeLabel(XmiElement parent, string label)
private void AddEdgeLabel(XmiElement parent, string label)
{
Guid guid = Guid.NewGuid();
//additional attribute body
var additionalAttributes = new List<XmiAttributeDTO>()
var additionalAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "",
AttributeName = "body",
AttributeValue = label,
}
};
return _xmiBuilder.AddElement(parent, "guard", XmiType.UmlOpaqueExpression, guid.ToString(), label, additionalAttributes);
_xmiBuilder.AddElement(parent, "guard", XmiType.UmlOpaqueExpression, guid.ToString(), label, additionalAttributes);
}
private XmiElement AddIncomming(XmiElement parent, XmiElement edge)
private void AddIncomming(XmiElement parent, XmiElement edge)
{
if(edge is null)
{
return null;
return;
}
var additionalAttributes = new List<XmiAttributeDTO>()
var additionalAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "idref",
AttributeValue = edge.XmlElement.GetAttribute("xmi:id"),
XmlNamespace = XmiBuilder.GetNamespace("xmi")
}
};
return _xmiBuilder.AddElement(parent, "incoming", additionalAttributes);
};
_xmiBuilder.AddElement(parent, "incoming", additionalAttributes);
}
private XmiElement AddOutgoing(XmiElement parent, XmiElement edge)
private void AddOutgoing(XmiElement parent, XmiElement edge)
{
var additionalAttributes = new List<XmiAttributeDTO>()
var additionalAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "idref",
......@@ -262,7 +238,7 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
XmlNamespace = XmiBuilder.GetNamespace("xmi")
}
};
return _xmiBuilder.AddElement(parent, "outgoing", additionalAttributes);
_xmiBuilder.AddElement(parent, "outgoing", additionalAttributes);
}
public string? Build(XmiElement lastClosedDecision)
......@@ -282,7 +258,7 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
for (int i = 0; i < edges.Count && i < 2; i++)
{
var edgeId = edges[i].Attributes.GetNamedItem("xmi:idref").Value;
var edgeElement = _edges.FirstOrDefault(x => x.XmlElement.GetAttribute("xmi:id") == edgeId);
var edgeElement = _edges.Find(x => x.XmlElement.GetAttribute("xmi:id") == edgeId);
AddLabel(edgeElement, i == 0 ? "true" : "false");
}
......
......@@ -26,15 +26,15 @@ public class ClassBuilder : IClassBuilder
return new OperationBuilder(_xmiClassDiagramUmlBuilder, _class, name, returnType, visibilityType);
}
public IClassBuilder AddAssociation(string? targetClassName, string? name, VisibilityType visibilityType, AssociationType associationType)
public IClassBuilder AddAssociation(string? targetClass, string? name, VisibilityType visibilityType, AssociationType associationType)
{
_xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, name, visibilityType, associationType);
_xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClass, name, visibilityType, associationType);
return this;
}
public IClassBuilder AddGeneralization(string? targetClassName)
public IClassBuilder AddGeneralization(string? targetClass)
{
_xmiClassDiagramUmlBuilder.AddGeneralization(_class, targetClassName);
_xmiClassDiagramUmlBuilder.AddGeneralization(_class, targetClass);
return this;
}
}
\ No newline at end of file
......@@ -30,15 +30,15 @@ public class OperationBuilder : IOperationBuilder
return this;
}
public IClassBuilder AddAssociation(string? targetClassName, string? name, VisibilityType visibilityType, AssociationType associationType)
public IClassBuilder AddAssociation(string? targetClass, string? name, VisibilityType visibilityType, AssociationType associationType)
{
_xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, name, visibilityType, associationType);
_xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClass, name, visibilityType, associationType);
return this;
}
public IClassBuilder AddGeneralization(string? targetClassName)
public IClassBuilder AddGeneralization(string? targetClass)
{
_xmiClassDiagramUmlBuilder.AddGeneralization(_class, targetClassName);
_xmiClassDiagramUmlBuilder.AddGeneralization(_class, targetClass);
return this;
}
......
......@@ -6,7 +6,7 @@ namespace DiagramBuilder.Class.Diagram;
public class PackageBuilder : IPackageBuilder
{
XmiClassDiagramUmlBuilder _xmiClassDiagramUmlBuilder;
readonly XmiClassDiagramUmlBuilder _xmiClassDiagramUmlBuilder;
private XmiElement _package { get; set; }
internal PackageBuilder(XmiClassDiagramUmlBuilder xmiClassDiagramUmlBuilder, string? name)
......
......@@ -30,7 +30,7 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
public XmiElement AddClass(XmiElement parent, string? name, bool isAbstract)
{
//add isAbstract attribute
var isAbstractAttribute = new XmiAttributeDTO()
var isAbstractAttribute = new XmiAttributeDto()
{
AttributeName = "isAbstract",
AttributeValue = isAbstract ? "true" : "false"
......@@ -45,14 +45,14 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
public void AddProperty(XmiElement parent, string? name, VisibilityType visibilityType, PropertyType propertyType)
{
//add visibility attribute
var visibilityAttribute = new XmiAttributeDTO()
var visibilityAttribute = new XmiAttributeDto()
{
AttributeName = "visibility",
AttributeValue = Convertor.VisibilityTypeToString(visibilityType)
};
var property = AddOwnedAttribute(parent, XmiType.UmlProperty, name, new(){visibilityAttribute});
//add href attribute
var hrefAttribute = new XmiAttributeDTO()
var hrefAttribute = new XmiAttributeDto()
{
AttributeName = "href",
AttributeValue = $"http://www.omg.org/spec/UML/20131001/UML.xmi#{Convertor.PropertyTypeToDataTypeString(propertyType)}"
......@@ -66,7 +66,7 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
public XmiElement AddOperation(XmiElement parent, string? name, PropertyType returnType, VisibilityType visibilityType)
{
//add visibility attribute
var visibilityAttribute = new XmiAttributeDTO()
var visibilityAttribute = new XmiAttributeDto()
{
AttributeName = "visibility",
AttributeValue = Convertor.VisibilityTypeToString(visibilityType)
......@@ -75,14 +75,14 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
var operation = AddOwnedOperation(parent, XmiType.UmlOperation, name, new(){visibilityAttribute});
if (returnType != PropertyType.NonPrimitiveType && returnType != PropertyType.NoDataType)
{
var directionAttribute = new XmiAttributeDTO()
var directionAttribute = new XmiAttributeDto()
{
AttributeName = "direction",
AttributeValue = "return"
};
var parameter = AddOwnedParameter(operation, XmiType.UmlParameter, "returnParameter", new(){ directionAttribute }, false);
var hrefAttribute = new XmiAttributeDTO()
var hrefAttribute = new XmiAttributeDto()
{
AttributeName = "href",
AttributeValue = $"http://www.omg.org/spec/UML/20131001/UML.xmi#{Convertor.PropertyTypeToDataTypeString(returnType)}"
......@@ -116,24 +116,24 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
_associations.Add(association);
var attributes = new List<XmiAttributeDTO>()
var attributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "visibility",
AttributeValue = Convertor.VisibilityTypeToString(visibilityType)
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "association",
AttributeValue = associationName
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "aggregation",
AttributeValue = Convertor.AssociationTypeToString(associationType)
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "type",
AttributeValue = $"{packageName}-{targetClassName}"
......@@ -149,13 +149,13 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
{
if (propertyType != PropertyType.NonPrimitiveType && propertyType != PropertyType.NoDataType)
{
var directionAttribute = new XmiAttributeDTO()
var directionAttribute = new XmiAttributeDto()
{
AttributeName = "direction",
AttributeValue = "in"
};
var parameter = AddOwnedParameter(parent, XmiType.UmlParameter, name, new(){ directionAttribute });
var hrefAttribute = new XmiAttributeDTO()
var hrefAttribute = new XmiAttributeDto()
{
AttributeName = "href",
AttributeValue = $"http://www.omg.org/spec/UML/20131001/UML.xmi#{Convertor.PropertyTypeToDataTypeString(propertyType)}"
......@@ -172,9 +172,9 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
string? parentName = parentClass.XmlElement.GetAttribute("name");
var attributes = new List<XmiAttributeDTO>()
var attributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "general",
AttributeValue = $"{packageName}-{targetClassName}"
......@@ -184,40 +184,40 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
_nextClassGeneralizationId[parentName]++;
}
private XmiElement AddOwnedAttribute(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDTO>? additionalAttributes)
private XmiElement AddOwnedAttribute(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDto>? additionalAttributes)
{
return _xmiBuilder.AddElement(parent,"ownedAttribute", classXmiType, name, additionalAttributes);
}
private XmiElement AddOwnedOperation(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDTO>? additionalAttributes)
private XmiElement AddOwnedOperation(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDto>? additionalAttributes)
{
return _xmiBuilder.AddElement(parent,"ownedOperation", classXmiType, name, additionalAttributes);
}
private XmiElement AddOwnedParameter(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDTO>? additionalAttributes, bool addAttributeName = true)
private XmiElement AddOwnedParameter(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDto>? additionalAttributes, bool addAttributeName = true)
{
return _xmiBuilder.AddElement(parent,"ownedParameter", classXmiType, name, additionalAttributes, addAttributeName);
}
private XmiElement AddPackagedElement(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDTO>? additionalAttributes)
private XmiElement AddPackagedElement(XmiElement parent, XmiType classXmiType, string? name, List<XmiAttributeDto>? additionalAttributes)
{
return _xmiBuilder.AddElement(parent, "packagedElement", classXmiType, name, additionalAttributes);
}
private XmiElement AddTypeAttribute(XmiElement parent, PropertyType propertyType, List<XmiAttributeDTO>? additionalAttributes)
private XmiElement AddTypeAttribute(XmiElement parent, PropertyType propertyType, List<XmiAttributeDto>? additionalAttributes)
{
//$"{parent.XmlElement.GetAttribute("id")}-{name}",
return _xmiBuilder.AddElement(parent,"type", propertyType, string.Empty, string.Empty, additionalAttributes);
}
private void AddLowerValueAttribute(XmiElement parent, PropertyType propertyType,
List<XmiAttributeDTO>? additionalAttributes)
List<XmiAttributeDto>? additionalAttributes)
{
string id = $"{parent.XmlElement.GetAttribute("xmi:id").ToString()}-_lowerValue";
_xmiBuilder.AddElement(parent,"lowerValue", propertyType, id, string.Empty, additionalAttributes);
}
private void AddGeneralizationAttribute(XmiElement parent, List<XmiAttributeDTO>? additionalAttributes)
private void AddGeneralizationAttribute(XmiElement parent, List<XmiAttributeDto>? additionalAttributes)
{
string packageName = parent.XmlElement.GetAttribute("xmi:id").Split('-')[0];
string? parentName = parent.XmlElement.GetAttribute("name");
......@@ -238,14 +238,14 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
if (_elementClasses.TryGetValue(association.Target.ClassName, out var targetElement))
{
//add association="package1-Association1"
var attributes = new List<XmiAttributeDTO>()
var attributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "association",
AttributeValue = $"{association.Package}-{association.Name}"
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "type",
AttributeValue = $"{association.Package}-{association.Source.ClassName}"
......@@ -254,7 +254,7 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
AddOwnedAttribute(targetElement, XmiType.UmlProperty, association.Target.AssociationProperyName, attributes);
var package = _packages[association.Package];
var memberEndAttribute = new XmiAttributeDTO()
var memberEndAttribute = new XmiAttributeDto()
{
AttributeName = "memberEnd",
AttributeValue = $"{association.Package}-{association.Target.ClassName}-{association.Target.AssociationProperyName} {association.Package}-{association.Source.ClassName}-{association.Source.AssociationProperyName}"
......
......@@ -3,7 +3,7 @@ using DiagramBuilder.XML;
namespace DiagramBuilder;
public class Convertor
public static class Convertor
{
public static string XmiTypeToString(XmiType classXmiType, string prefix)
{
......
namespace DiagramBuilder.XML;
public class XmiAttributeDTO
public class XmiAttributeDto
{
public string Prefix { get; set; }
public string AttributeName { get; set; }
......
......@@ -6,28 +6,28 @@ public class XmiBuilder : XmlBuilder
{
public void InitializeUmlRootElement(string? diagramName)
{
XmlElementDTO xmlElementDto = new XmlElementDTO()
XmlElementDto xmlElementDto = new XmlElementDto()
{
Prefix = "uml",
ElementName = "Model",
XmlNamespace = GetNamespace("uml"),
XmlAttributes = new()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "version",
AttributeValue = "2.5.1",
XmlNamespace = GetNamespace("xmi")
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "id",
AttributeValue = "_0",
XmlNamespace = GetNamespace("xmi")
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
AttributeName = "name",
AttributeValue = diagramName,
......@@ -37,56 +37,53 @@ public class XmiBuilder : XmlBuilder
InitializeDocument(xmlElementDto);
}
public XmiElement AddElement(XmiElement parent, string elementName, List<XmiAttributeDTO>? additionalAttributes)
public XmiElement AddElement(XmiElement parent, string elementName, List<XmiAttributeDto>? additionalAttributes)
{
XmlElementDTO element = new XmlElementDTO()
XmlElementDto element = new XmlElementDto()
{
ElementName = elementName,
XmlAttributes = new List<XmiAttributeDTO>()
XmlAttributes = new List<XmiAttributeDto>()
};
if (!additionalAttributes.Any(x => x.AttributeName == "idref"))
if (!additionalAttributes.Exists(x => x.AttributeName == "idref"))
{
element.XmlAttributes.Add(new XmiAttributeDTO()
element.XmlAttributes.Add(new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "id",
AttributeValue = string.IsNullOrEmpty(parent?.XmlElement?.GetAttribute("xmi:id"))
? elementName
: elementName, //$"{parent?.XmlElement?.GetAttribute("xmi:id")}-{elementName}",
AttributeValue = elementName, //$"{parent?.XmlElement?.GetAttribute("xmi:id")}-{elementName}",
XmlNamespace = GetNamespace("xmi")
});
}
element.XmlAttributes.AddRange(additionalAttributes ?? new List<XmiAttributeDTO>());
element.XmlAttributes.AddRange(additionalAttributes);
if(parent == null)
return AddChildElement(_root, element);
return AddChildElement(parent.XmlElement, element);
}
public XmiElement AddElement(XmiElement parent, string elementName, XmiType classXmiType, string? name, List<XmiAttributeDTO>? additionalAttributes, bool addAttributeName = true)
public XmiElement AddElement(XmiElement parent, string elementName, XmiType classXmiType, string? name, List<XmiAttributeDto>? additionalAttributes, bool addAttributeName = true)
{
XmlElementDTO element = new XmlElementDTO()
XmlElementDto element = new XmlElementDto()
{
ElementName = elementName,
XmlAttributes = new List<XmiAttributeDTO>()
XmlAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "type",
AttributeValue = Convertor.XmiTypeToString(classXmiType, "uml"),
XmlNamespace = GetNamespace("xmi")
},
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "id",
AttributeValue =
string.IsNullOrEmpty(parent?.XmlElement?.GetAttribute("xmi:id"))
? name
: $"{parent?.XmlElement?.GetAttribute("xmi:id")}-{name}",
AttributeValue = string.IsNullOrEmpty(parent?.XmlElement?.GetAttribute("xmi:id"))
? name
: $"{parent?.XmlElement?.GetAttribute("xmi:id")}-{name}",
XmlNamespace = GetNamespace("xmi")
}
}
......@@ -94,7 +91,7 @@ public class XmiBuilder : XmlBuilder
if (addAttributeName)
{
element.XmlAttributes.Add(new XmiAttributeDTO()
element.XmlAttributes.Add(new XmiAttributeDto()
{
AttributeName = "name",
AttributeValue = name,
......@@ -111,14 +108,14 @@ public class XmiBuilder : XmlBuilder
return AddChildElement(parent.XmlElement, element);
}
public XmiElement AddElement(XmiElement parent, string elementName, XmiType classXmiType, string id, string name, List<XmiAttributeDTO>? additionalAttributes)
public XmiElement AddElement(XmiElement parent, string elementName, XmiType classXmiType, string id, string name, List<XmiAttributeDto>? additionalAttributes)
{
XmlElementDTO element = new XmlElementDTO()
XmlElementDto element = new XmlElementDto()
{
ElementName = elementName,
XmlAttributes = new List<XmiAttributeDTO>()
XmlAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "type",
......@@ -135,7 +132,7 @@ public class XmiBuilder : XmlBuilder
if (!string.IsNullOrEmpty(id))
{
var attributeId = new XmiAttributeDTO()
var attributeId = new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "id",
......@@ -147,7 +144,7 @@ public class XmiBuilder : XmlBuilder
if(!string.IsNullOrEmpty(name))
{
var attributeName = new XmiAttributeDTO()
var attributeName = new XmiAttributeDto()
{
AttributeName = "name",
AttributeValue = name,
......@@ -160,14 +157,14 @@ public class XmiBuilder : XmlBuilder
return AddChildElement(parent.XmlElement, element);
}
public XmiElement AddElement(XmiElement parent, string elementName, PropertyType propertyType, string id, string name, List<XmiAttributeDTO>? additionalAttributes)
public XmiElement AddElement(XmiElement parent, string elementName, PropertyType propertyType, string id, string name, List<XmiAttributeDto>? additionalAttributes)
{
XmlElementDTO element = new XmlElementDTO()
XmlElementDto element = new XmlElementDto()
{
ElementName = elementName,
XmlAttributes = new List<XmiAttributeDTO>()
XmlAttributes = new List<XmiAttributeDto>()
{
new XmiAttributeDTO()
new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "type",
......@@ -184,7 +181,7 @@ public class XmiBuilder : XmlBuilder
if (!string.IsNullOrEmpty(id))
{
var attributeId = new XmiAttributeDTO()
var attributeId = new XmiAttributeDto()
{
Prefix = "xmi",
AttributeName = "id",
......@@ -196,7 +193,7 @@ public class XmiBuilder : XmlBuilder
if(!string.IsNullOrEmpty(name))
{
var attributeName = new XmiAttributeDTO()
var attributeName = new XmiAttributeDto()
{
AttributeName = "name",
AttributeValue = name,
......@@ -220,15 +217,4 @@ public class XmiBuilder : XmlBuilder
};
}
private string GetNamespace(PropertyType propertyType)
{
return propertyType switch
{
PropertyType.PrimitiveTypeBoolean => @"http://www.omg.org/spec/UML/20090901/UML.xmi#Boolean",
PropertyType.LiteralInteger => GetNamespace("uml"),
PropertyType.LiteralBoolean => GetNamespace("uml"),
_ => throw new ArgumentOutOfRangeException(nameof(propertyType), propertyType, null)
};
}
}
\ No newline at end of file
......@@ -31,10 +31,10 @@ namespace DiagramBuilder.XML
return _xmlDocument.OuterXml.Replace("><", ">\n<");
}
protected void InitializeDocument(XmlElementDTO xmlElementDto)
protected void InitializeDocument(XmlElementDto xmlElementDto)
{
if(IsDocumentInitialized)
throw new Exception("Document is already initialized");
throw new NotSupportedException("Document is already initialized");
XmlElement childElement = _xmlDocument.CreateElement(xmlElementDto.Prefix, xmlElementDto.ElementName, xmlElementDto.XmlNamespace);
childElement.InnerText = xmlElementDto.ElementValue;
foreach(var attribute in xmlElementDto.XmlAttributes)
......@@ -49,7 +49,7 @@ namespace DiagramBuilder.XML
IsDocumentInitialized = true;
}
protected XmiElement AddChildElement(XmlElement parent, XmlElementDTO xmlElementDto)
protected XmiElement AddChildElement(XmlElement parent, XmlElementDto xmlElementDto)
{
XmlElement childElement = _xmlDocument.CreateElement(xmlElementDto.Prefix, xmlElementDto.ElementName, xmlElementDto.XmlNamespace);
childElement.InnerText = xmlElementDto.ElementValue;
......
......@@ -2,11 +2,11 @@
namespace DiagramBuilder.XML;
public class XmlElementDTO
public class XmlElementDto
{
public string Prefix { get; set; }
public string ElementName { get; set; }
public string ElementValue { get; set; }
public string XmlNamespace { get; set; }
public List<XmiAttributeDTO> XmlAttributes { get; set; } = new List<XmiAttributeDTO>();
public List<XmiAttributeDto> XmlAttributes { get; set; } = new List<XmiAttributeDto>();
}
\ No newline at end of file
using Antlr4.Runtime;
using System.IO;
public abstract class CPP14ParserBase : Parser {
......@@ -21,7 +20,7 @@ public abstract class CPP14ParserBase : Parser {
}
catch
{
return false;
}
return false;
}
}
\ No newline at end of file
......@@ -12,8 +12,8 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
private Stack<(IDecisionBuilder, Stack<BranchType>)> _decisionBuilderStack { get; set; } = new Stack<(IDecisionBuilder, Stack<BranchType>)>();
private long decisionUniqueueId { get; set; } = 0;
private string actualContext { get; set; } = string.Empty;
private string contextIdentifier { get; set; } = string.Empty;
private string actualContext { get; set; } = String.Empty;
private string contextIdentifier { get; set; }
public CppActivityDiagramVisitor(IDiagramBuilder diagramBuilder, string contextIdentifier, string functionIdentifier)
{
......@@ -82,7 +82,8 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
var functionName = context.declarator().pointerDeclarator().noPointerDeclarator().noPointerDeclarator()
.declaratorid().GetText();
if (this.functionIdentifier == functionName && this.contextIdentifier == this.actualContext)
if (this.functionIdentifier == functionName &&
(string.IsNullOrEmpty(this.contextIdentifier) || this.contextIdentifier == this.actualContext))
{
Visit(context.functionBody());
}
......@@ -98,8 +99,6 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
public override object VisitCompoundStatement(CPP14Parser.CompoundStatementContext context)
{
List<string> statements = new List<string>();
foreach (var statement in context.statementSeq().statement())
{
var text = Visit(statement);
......@@ -198,7 +197,7 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
_decisionBuilderStack.Peek().Item2.Pop();
}
long count = _decisionBuilderStack.Count();
_ = _decisionBuilderStack.Count;
decisionUniqueueId++;
_decisionBuilderStack.Pop().Item1.AddMerge($"merge-{decisionUniqueueId}");
return null;
......
......@@ -91,62 +91,84 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object>
else if (child is CPP14Parser.MemberdeclarationContext mdc)
{
var member = Visit(mdc);
HandleMemberDeclarationContext(member, actualAccessSpecifier);
if(member is Function function)
{
var operationBuilder = _classes.Last().Value.AddOperation(function.Name, Convertor.StringToPropertyType(function.ReturnType), actualAccessSpecifier);
if (function.Parameters != null)
foreach (var param in function.Parameters)
{
operationBuilder.AddParameter(param.Name, Convertor.StringToPropertyType(param.Type));
}
}
else if (member is Atribute atribute)
{
var propertyType = atribute.GetPropertyType();
if (propertyType != PropertyType.NonPrimitiveType)
{
var propertyBuilder = _classes.Last().Value
.AddProperty(atribute.Name, actualAccessSpecifier, propertyType);
}
else
{
// Regular expressions
string aggregationPattern = @"^(?:std::)?(?:vector<)?(\w+)\*>?(?![\w*])$";
string compositionPattern = @"^(?:std::)?(?:vector<)?(\w+)>?$";
// Check if the property type matches aggregation or composition
Match aggregationMatch = Regex.Match(atribute.Type, aggregationPattern);
Match compositionMatch = Regex.Match(atribute.Type, compositionPattern);
int groupMatch = 1;
if (aggregationMatch.Success && !string.IsNullOrEmpty(aggregationMatch.Groups[groupMatch].Value))
{
// Aggregation type
string? typeName = aggregationMatch.Groups[groupMatch].Value; // Second capturing group
_classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier,
AssociationType.Aggregation);
}
else if (compositionMatch.Success && !string.IsNullOrEmpty(compositionMatch.Groups[groupMatch].Value))
{
// Composition type
string? typeName = compositionMatch.Groups[groupMatch].Value; // Second capturing group
_classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier,
AssociationType.Composition);
}
else
{
// Default to regular association if no match is found
_classes.Last().Value.AddAssociation(atribute.Type, atribute.Name, actualAccessSpecifier,
AssociationType.Association);
}
}
}
}
}
return "";
}
private void HandleMemberDeclarationContext(object member, VisibilityType actualAccessSpecifier)
{
if(member is Function function)
{
HandleFunctionMemberDeclaration(function, actualAccessSpecifier);
}
else if (member is Atribute atribute)
{
HandleAttributeMemberDeclaration(atribute, actualAccessSpecifier);
}
}
private void HandleFunctionMemberDeclaration(Function function, VisibilityType actualAccessSpecifier)
{
var operationBuilder = _classes.Last().Value.AddOperation(function.Name, Convertor.StringToPropertyType(function.ReturnType), actualAccessSpecifier);
if (function.Parameters != null)
{
foreach (var param in function.Parameters)
{
operationBuilder.AddParameter(param.Name, Convertor.StringToPropertyType(param.Type));
}
}
}
private void HandleAttributeMemberDeclaration(Atribute atribute, VisibilityType actualAccessSpecifier)
{
var propertyType = atribute.GetPropertyType();
if (propertyType != PropertyType.NonPrimitiveType)
{
_ = _classes.Last().Value
.AddProperty(atribute.Name, actualAccessSpecifier, propertyType);
}
else
{
HandleNonPrimitiveAttributeMemberDeclaration(atribute, actualAccessSpecifier);
}
}
private void HandleNonPrimitiveAttributeMemberDeclaration(Atribute atribute, VisibilityType actualAccessSpecifier)
{
// Regular expressions
string aggregationPattern = @"^(?:std::)?(?:vector<)?(\w+)\*>?(?![\w*])$";
string compositionPattern = @"^(?:std::)?(?:vector<)?(\w+)>?$";
// Check if the property type matches aggregation or composition
Match aggregationMatch = Regex.Match(atribute.Type, aggregationPattern);
Match compositionMatch = Regex.Match(atribute.Type, compositionPattern);
int groupMatch = 1;
if (aggregationMatch.Success && !string.IsNullOrEmpty(aggregationMatch.Groups[groupMatch].Value))
{
// Aggregation type
string? typeName = aggregationMatch.Groups[groupMatch].Value; // Second capturing group
_classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier,
AssociationType.Aggregation);
}
else if (compositionMatch.Success && !string.IsNullOrEmpty(compositionMatch.Groups[groupMatch].Value))
{
// Composition type
string? typeName = compositionMatch.Groups[groupMatch].Value; // Second capturing group
_classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier,
AssociationType.Composition);
}
else
{
// Default to regular association if no match is found
_classes.Last().Value.AddAssociation(atribute.Type, atribute.Name, actualAccessSpecifier,
AssociationType.Association);
}
}
public override object VisitMemberdeclaration(CPP14Parser.MemberdeclarationContext context)
{
if(context.declSpecifierSeq() != null)
......@@ -200,7 +222,7 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object>
Parameter parameter = new();
if (context.declSpecifierSeq() != null)
{
parameter.Type = Visit(context.declSpecifierSeq().declSpecifier().Last().typeSpecifier().trailingTypeSpecifier().simpleTypeSpecifier()).ToString();
parameter.Type = Visit(context.declSpecifierSeq().declSpecifier()[context.declSpecifierSeq().declSpecifier().Length-1].typeSpecifier().trailingTypeSpecifier().simpleTypeSpecifier()).ToString();
}
parameter.Name = Visit(context.declarator().pointerDeclarator().noPointerDeclarator().declaratorid()).ToString();
return parameter;
......
......@@ -33,7 +33,6 @@ public class ClassDiagramTests
// Additional assertions for XMI structure
Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header");
//Assert.IsTrue(xmi.Contains("<xmi:XMI"), "XMI should contain the XMI root element");
// Add more assertions based on the expected structure of your XMI
File.WriteAllText(generatedFileName, xmi);
......@@ -57,7 +56,7 @@ public class ClassDiagramTests
{
if (numberOfPackages >= 1)
{
var package = ClassDiagramBuilder.AddPackage("TestPackage");
_ = ClassDiagramBuilder.AddPackage("TestPackage");
for (int i = 1; i < numberOfPackages; i++)
{
ClassDiagramBuilder.AddPackage($"TestPackage{i}");
......@@ -68,7 +67,6 @@ public class ClassDiagramTests
// Additional assertions for XMI structure
Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header");
//Assert.IsTrue(xmi.Contains("<xmi:XMI"), "XMI should contain the XMI root element");
// Add more assertions based on the expected structure of your XMI
File.WriteAllText(generatedFileName, xmi);
......@@ -96,7 +94,6 @@ public class ClassDiagramTests
// Additional assertions for XMI structure
Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header");
//Assert.IsTrue(xmi.Contains("<xmi:XMI"), "XMI should contain the XMI root element");
// Add more assertions based on the expected structure of your XMI
File.WriteAllText(generatedFileName, xmi);
......@@ -128,7 +125,6 @@ public class ClassDiagramTests
// Additional assertions for XMI structure
Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header");
//Assert.IsTrue(xmi.Contains("<xmi:XMI"), "XMI should contain the XMI root element");
// Add more assertions based on the expected structure of your XMI
File.WriteAllText(generatedFileName, xmi);
......@@ -199,7 +195,7 @@ public class ClassDiagramTests
public void BuildDiagramWithMixedAssociationsAndGeneralization(string? targetAssociation, AssociationType type, VisibilityType visibilityType, bool isValid)
{
var package = ClassDiagramBuilder.AddPackage("TestPackage");
var class1 = package.AddClass("Class1", false);
_ = package.AddClass("Class1", false);
var class2 = package.AddClass("Class2", false);
class2.AddAssociation(targetAssociation, "association",visibilityType, type);
......@@ -223,7 +219,7 @@ public class ClassDiagramTests
var package = ClassDiagramBuilder.AddPackage("TestPackage");
// Add classes with the same name (should handle gracefully)
var class1 = package.AddClass("Class1", false);
_ = package.AddClass("Class1", false);
Assert.Throws<ArgumentException>(() => package.AddClass("Class1", false));
......@@ -264,7 +260,7 @@ public class ClassDiagramTests
public void BuildDiagramWithGeneralization()
{
var package = ClassDiagramBuilder.AddPackage("TestPackage");
var class1 = package.AddClass("Class1", false);
_ = package.AddClass("Class1", false);
var class2 = package.AddClass("Class2", false);
class2.AddGeneralization("Class1");
......@@ -299,7 +295,7 @@ public class ClassDiagramTests
using (XmlReader reader = XmlReader.Create(generatedFileName, settings))
{
// Read through the XML document
while (reader.Read()) { }
reader.Read();
}
// Assert that there are no errors
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment