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

fix(#24), refactor(#26, #25): Modifications and fixes, testing

parent 27d83465
Branches feature/AddForOption
1 merge request!15merge: develop into main
Pipeline #956 passed with stages
in 6 minutes and 25 seconds
...@@ -14,6 +14,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder ...@@ -14,6 +14,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder
private Stack<XmiElement> _loopElements { get; set; } = new Stack<XmiElement>(); private Stack<XmiElement> _loopElements { get; set; } = new Stack<XmiElement>();
private XmiElement _lastClosedDecision { get; set; } = null; private XmiElement _lastClosedDecision { get; set; } = null;
private XmiElement _lastOpenedDecision { get; set; } = null;
internal ActivityDiagramBuilder() internal ActivityDiagramBuilder()
{ {
...@@ -43,6 +44,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder ...@@ -43,6 +44,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder
else else
LastActivity = _xmiActivityDiagramUmlBuilder.AddDecision(_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new() {_lastEdge}, null, _lastClosedDecision); LastActivity = _xmiActivityDiagramUmlBuilder.AddDecision(_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new() {_lastEdge}, null, _lastClosedDecision);
_loopElements.Push(LastActivity); _loopElements.Push(LastActivity);
_lastOpenedDecision = LastActivity;
return this; return this;
} }
...@@ -62,7 +64,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder ...@@ -62,7 +64,7 @@ public class ActivityDiagramBuilder : IDiagramBuilder
else else
LastActivity = _xmiActivityDiagramUmlBuilder.AddDecision(_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new() {_lastEdge}, null, _lastClosedDecision); LastActivity = _xmiActivityDiagramUmlBuilder.AddDecision(_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new() {_lastEdge}, null, _lastClosedDecision);
return new DecisionBuilder(this._name, this._xmiActivityDiagramUmlBuilder, _lastEdge, LastActivity, this); return new DecisionBuilder(this._name, this._xmiActivityDiagramUmlBuilder, _lastEdge, LastActivity, _lastOpenedDecision, this);
} }
public string? BuildDiagram() public string? BuildDiagram()
......
...@@ -14,6 +14,7 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -14,6 +14,7 @@ namespace DiagramBuilder.Activity.Diagram
private List<Dictionary<BranchType, XmiElement>> _lastAddedEdge { get; set; } = new(); private List<Dictionary<BranchType, XmiElement>> _lastAddedEdge { get; set; } = new();
private List<Dictionary<BranchType, XmiElement>> _loopElements { get; set; } = new(); private List<Dictionary<BranchType, XmiElement>> _loopElements { get; set; } = new();
private List<Dictionary<BranchType, XmiElement>> _lastAddedNode { get; set; } = new(); private List<Dictionary<BranchType, XmiElement>> _lastAddedNode { get; set; } = new();
private List<XmiElement> _lastAddedLoopNode { get; set; } = new();
IDiagramBuilder _diagramBuilder { get; set; } IDiagramBuilder _diagramBuilder { get; set; }
private List<BranchType> _lastBranchTypeForDecision { get; set; } = new(); private List<BranchType> _lastBranchTypeForDecision { get; set; } = new();
...@@ -21,7 +22,8 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -21,7 +22,8 @@ namespace DiagramBuilder.Activity.Diagram
private long _actualDecisionId { get; set; } = 0; private long _actualDecisionId { get; set; } = 0;
public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder, public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder,
XmiElement trueBranchEdge, XmiElement lastAddedNode, IDiagramBuilder _diagramBuilder) XmiElement trueBranchEdge, XmiElement lastAddedNode, XmiElement lastOpenedDecision,
IDiagramBuilder _diagramBuilder)
{ {
this._diagramBuilder = _diagramBuilder; this._diagramBuilder = _diagramBuilder;
_xmiActivityDiagramUmlBuilder = xmiActivityDiagramUmlBuilder; _xmiActivityDiagramUmlBuilder = xmiActivityDiagramUmlBuilder;
...@@ -32,6 +34,7 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -32,6 +34,7 @@ namespace DiagramBuilder.Activity.Diagram
_lastAddedEdge[^1].Add(BranchType.True, trueBranchEdge); _lastAddedEdge[^1].Add(BranchType.True, trueBranchEdge);
_lastAddedNode[^1].Add(BranchType.True, lastAddedNode); _lastAddedNode[^1].Add(BranchType.True, lastAddedNode);
_lastAddedNode[^1].Add(BranchType.False, lastAddedNode); _lastAddedNode[^1].Add(BranchType.False, lastAddedNode);
_lastAddedLoopNode.Add(lastOpenedDecision);
} }
public string? BuildDiagram() public string? BuildDiagram()
...@@ -64,9 +67,14 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -64,9 +67,14 @@ namespace DiagramBuilder.Activity.Diagram
public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name) public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name)
{ {
XmiElement lastAddedDecisionNode = _lastAddedLoopNode[^1];
if(_lastAddedLoopNode.Count > 1)
{
lastAddedDecisionNode = _lastAddedLoopNode[^2];
}
var mergeNode = _xmiActivityDiagramUmlBuilder.AddMerge( var mergeNode = _xmiActivityDiagramUmlBuilder.AddMerge(
_xmiActivityDiagramUmlBuilder.ActivityDiagram, name, _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
_lastAddedNode[^1][BranchType.True], _lastAddedNode[^1][BranchType.False]); _lastAddedNode[^1][BranchType.True], _lastAddedNode[^1][BranchType.False], lastAddedDecisionNode);
_lastAddedEdge.Remove(_lastAddedEdge.Last()); _lastAddedEdge.Remove(_lastAddedEdge.Last());
_lastAddedNode.Remove(_lastAddedNode.Last()); _lastAddedNode.Remove(_lastAddedNode.Last());
...@@ -79,7 +87,10 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -79,7 +87,10 @@ namespace DiagramBuilder.Activity.Diagram
_lastAddedNode.Last()[_lastBranchTypeForDecision.Last()] = mergeNode; _lastAddedNode.Last()[_lastBranchTypeForDecision.Last()] = mergeNode;
_lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count - 1); _lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count - 1);
if (_lastAddedLoopNode.Count > 2)
{
_lastAddedLoopNode.RemoveAt(_lastAddedLoopNode.Count - 1);
}
return (this, null); return (this, null);
} }
...@@ -140,6 +151,7 @@ namespace DiagramBuilder.Activity.Diagram ...@@ -140,6 +151,7 @@ namespace DiagramBuilder.Activity.Diagram
_loopElements.Add(new Dictionary<BranchType, XmiElement>()); _loopElements.Add(new Dictionary<BranchType, XmiElement>());
_loopElements[^1].Add(type, _lastAddedNode[^1][type]); _loopElements[^1].Add(type, _lastAddedNode[^1][type]);
_lastAddedLoopNode.Add(_lastAddedNode[^1][type]);
return this; return this;
} }
......
...@@ -61,9 +61,10 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder ...@@ -61,9 +61,10 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
public XmiElement AddMerge(XmiElement parent, string? name, XmiElement lastTrueBranchNode, XmiElement lastFalseBranchNode) public XmiElement AddMerge(XmiElement parent, string? name, XmiElement lastTrueBranchNode,
XmiElement lastFalseBranchNode, XmiElement lastAddedDecisionNode)
{ {
_lastAddedNodeElement = AddMergeNode(parent, name, lastTrueBranchNode, lastFalseBranchNode); _lastAddedNodeElement = AddMergeNode(parent, name, lastTrueBranchNode, lastFalseBranchNode, lastAddedDecisionNode);
_nodes.Add(_lastAddedNodeElement.XmlElement.GetAttribute("xmi:id"), _lastAddedNodeElement); _nodes.Add(_lastAddedNodeElement.XmlElement.GetAttribute("xmi:id"), _lastAddedNodeElement);
return _lastAddedNodeElement; return _lastAddedNodeElement;
} }
...@@ -166,11 +167,15 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder ...@@ -166,11 +167,15 @@ public class XmiActivityDiagramUmlBuilder : DiagramUmlBuilder
return _edges.LastOrDefault(); return _edges.LastOrDefault();
} }
private XmiElement AddMergeNode(XmiElement parent, string? name, XmiElement lastTrueBranchNode, XmiElement lastFalseBranchNode) private XmiElement AddMergeNode(XmiElement parent, string? name, XmiElement lastTrueBranchNode,
XmiElement lastFalseBranchNode, XmiElement lastAddedDecisionNode)
{ {
var node = _xmiBuilder.AddElement(parent, "node", XmiType.UmlMergeNode, name, null); var node = _xmiBuilder.AddElement(parent, "node", XmiType.UmlMergeNode, name, null);
AddEdge(ActivityDiagram, lastTrueBranchNode, node); AddEdge(ActivityDiagram, lastTrueBranchNode,
AddEdge(ActivityDiagram, lastFalseBranchNode, node); lastTrueBranchNode.XmlElement.GetAttribute("name") != "continue;" ? node : lastAddedDecisionNode);
AddEdge(ActivityDiagram, lastFalseBranchNode,
lastFalseBranchNode.XmlElement.GetAttribute("name") != "continue;" ? node : lastAddedDecisionNode);
return node; return node;
} }
......
...@@ -42,9 +42,9 @@ public class OperationBuilder : IOperationBuilder ...@@ -42,9 +42,9 @@ public class OperationBuilder : IOperationBuilder
return this; return this;
} }
public IOperationBuilder AddParameter(string? name, PropertyType propertyType) public IOperationBuilder AddParameter(string? name, PropertyType propertyType, string? paramType)
{ {
_xmiClassDiagramUmlBuilder.AddParameter(_operation, name, propertyType); _xmiClassDiagramUmlBuilder.AddParameter(_operation, name, propertyType, paramType);
return this; return this;
} }
} }
\ No newline at end of file
...@@ -4,5 +4,5 @@ namespace DiagramBuilder.Class.Interface; ...@@ -4,5 +4,5 @@ namespace DiagramBuilder.Class.Interface;
public interface IOperationBuilder : IClassBuilder public interface IOperationBuilder : IClassBuilder
{ {
IOperationBuilder AddParameter(string? name, PropertyType propertyType); IOperationBuilder AddParameter(string? name, PropertyType propertyType, string? paramType);
} }
\ No newline at end of file
...@@ -145,22 +145,41 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder ...@@ -145,22 +145,41 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder
_nextPackageAssociationId[packageName]++; _nextPackageAssociationId[packageName]++;
} }
public void AddParameter(XmiElement parent, string? name, PropertyType propertyType) public void AddParameter(XmiElement parent, string? name, PropertyType propertyType, string? paramType)
{ {
if (propertyType != PropertyType.NonPrimitiveType && propertyType != PropertyType.NoDataType) if (propertyType != PropertyType.NoDataType)
{ {
XmiAttributeDto typeAttribute = null;
List<XmiAttributeDto> additionalAttributes = new();
var directionAttribute = new XmiAttributeDto() var directionAttribute = new XmiAttributeDto()
{ {
AttributeName = "direction", AttributeName = "direction",
AttributeValue = "in" AttributeValue = "in"
}; };
var parameter = AddOwnedParameter(parent, XmiType.UmlParameter, name, new(){ directionAttribute });
var hrefAttribute = new XmiAttributeDto() additionalAttributes.Add(directionAttribute);
if (_elementClasses.TryGetValue(paramType, out var paramReferenceTypeId))
{ {
AttributeName = "href", typeAttribute = new XmiAttributeDto()
AttributeValue = $"http://www.omg.org/spec/UML/20131001/UML.xmi#{Convertor.PropertyTypeToDataTypeString(propertyType)}" {
}; AttributeName = "type",
AddTypeAttribute(parameter, propertyType, new(){ hrefAttribute }); AttributeValue = paramReferenceTypeId.XmlElement.GetAttribute("xmi:id")
};
additionalAttributes.Add(typeAttribute);
}
var parameter = AddOwnedParameter(parent, XmiType.UmlParameter, name, additionalAttributes);
XmiAttributeDto referenceAttribute = null;
if (propertyType != PropertyType.NonPrimitiveType)
{
referenceAttribute = new XmiAttributeDto()
{
AttributeName = "href",
AttributeValue =
$"http://www.omg.org/spec/UML/20131001/UML.xmi#{Convertor.PropertyTypeToDataTypeString(propertyType)}"
};
AddTypeAttribute(parameter, propertyType, new(){ referenceAttribute });
}
} }
} }
......
...@@ -110,6 +110,7 @@ public static class Convertor ...@@ -110,6 +110,7 @@ public static class Convertor
or PropertyType.PrimitiveTypeString => $"{prefix}:PrimitiveType", or PropertyType.PrimitiveTypeString => $"{prefix}:PrimitiveType",
PropertyType.LiteralInteger => $"{prefix}:LiteralInteger", PropertyType.LiteralInteger => $"{prefix}:LiteralInteger",
PropertyType.LiteralBoolean => $"{prefix}:LiteralBoolean", PropertyType.LiteralBoolean => $"{prefix}:LiteralBoolean",
PropertyType.NonPrimitiveType => $"{prefix}:Class",
_ => throw new ArgumentOutOfRangeException(nameof(propertyType), propertyType, null) _ => throw new ArgumentOutOfRangeException(nameof(propertyType), propertyType, null)
}; };
} }
......
...@@ -115,7 +115,7 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> ...@@ -115,7 +115,7 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
public override object VisitJumpStatement(CPP14Parser.JumpStatementContext context) public override object VisitJumpStatement(CPP14Parser.JumpStatementContext context)
{ {
if (context.Return() != null) if (context.Return() != null || context.Continue() != null || context.Break() != null)
{ {
if (_decisionBuilderStack.Count > 0) if (_decisionBuilderStack.Count > 0)
{ {
...@@ -206,6 +206,12 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> ...@@ -206,6 +206,12 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
public override object VisitIterationStatement(CPP14Parser.IterationStatementContext context) public override object VisitIterationStatement(CPP14Parser.IterationStatementContext context)
{ {
var condition = context.condition().GetText(); var condition = context.condition().GetText();
if(context.forInitStatement() != null)
{
var forInitStatement = ExtractOriginalText(context.forInitStatement());
_diagramBuilder.AddAction(forInitStatement);
}
if (_decisionBuilderStack.Count == 0) if (_decisionBuilderStack.Count == 0)
_diagramBuilder.AddLoop(condition, condition); _diagramBuilder.AddLoop(condition, condition);
...@@ -213,6 +219,12 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> ...@@ -213,6 +219,12 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object>
_decisionBuilderStack.Peek().Item1.AddLoop(condition, condition, _decisionBuilderStack.Peek().Item2.Peek()); _decisionBuilderStack.Peek().Item1.AddLoop(condition, condition, _decisionBuilderStack.Peek().Item2.Peek());
Visit(context.statement()); Visit(context.statement());
if(context.expression() != null)
{
var expression = $"{ExtractOriginalText(context.expression())};";
_diagramBuilder.AddAction(expression);
}
if (_decisionBuilderStack.Count == 0) if (_decisionBuilderStack.Count == 0)
_diagramBuilder.CloseLoop(condition); _diagramBuilder.CloseLoop(condition);
......
...@@ -118,7 +118,7 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object> ...@@ -118,7 +118,7 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object>
{ {
foreach (var param in function.Parameters) foreach (var param in function.Parameters)
{ {
operationBuilder.AddParameter(param.Name, Convertor.StringToPropertyType(param.Type)); operationBuilder.AddParameter(param.Name, Convertor.StringToPropertyType(param.Type), param.Type);
} }
} }
} }
...@@ -194,7 +194,10 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object> ...@@ -194,7 +194,10 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object>
if (context.declSpecifierSeq() != null) if (context.declSpecifierSeq() != null)
{ {
int returnTypeIndex = context.declSpecifierSeq().declSpecifier().Length - 1; int returnTypeIndex = context.declSpecifierSeq().declSpecifier().Length - 1;
function.ReturnType = Visit(context.declSpecifierSeq().declSpecifier()[returnTypeIndex].typeSpecifier()).ToString(); if (context.declSpecifierSeq().declSpecifier()[returnTypeIndex].typeSpecifier() != null)
{
function.ReturnType = Visit(context.declSpecifierSeq().declSpecifier()[returnTypeIndex].typeSpecifier().trailingTypeSpecifier().simpleTypeSpecifier()).ToString();
}
} }
function.Name = Visit(context.declarator().pointerDeclarator().noPointerDeclarator().noPointerDeclarator().declaratorid().idExpression()).ToString(); function.Name = Visit(context.declarator().pointerDeclarator().noPointerDeclarator().noPointerDeclarator().declaratorid().idExpression()).ToString();
......
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