1119 Support method return types

Small refactor to split out logic for determining method display text and style. Updated documentation
Used regex to parse method statements in class diagrams to extract discrete elements to set display appropriately. Added tests and updated docs
This commit is contained in:
Justin Greywolf
2020-01-06 16:21:11 -08:00
parent 0af5e0b795
commit 58fbfc3c38
4 changed files with 68 additions and 16 deletions

View File

@@ -274,4 +274,19 @@ describe('Class diagram', () => {
);
cy.get('svg');
});
it('11: should render a simple class diagram with return type on method', () => {
imgSnapshotTest(
`
classDiagram
class Class10~T~ {
int[] id
test(int[] ids) bool
testArray() bool[]
}
`,
{}
);
cy.get('svg');
});
});

View File

@@ -115,7 +115,7 @@ There are two ways to define the members of a class, and regardless of whichever
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount) [bool]
BankAccount : +deposit(amount) bool
BankAccount : +withdrawal(amount)
```
``` mermaid
@@ -132,7 +132,7 @@ There are two ways to define the members of a class, and regardless of whichever
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) [bool]
+deposit(amount) bool
+withdrawl(amount)
}
```
@@ -147,6 +147,9 @@ class BankAccount{
```
#### Return Type
Optionally you can end the method/function definition with the data type that will be returned
#### Visibility
To specify the visibility of a class member (i.e. any attribute or method), these notations may be placed before the member's name, but it is optional:

View File

@@ -105,7 +105,7 @@ describe('class diagram, ', function () {
parser.parse(str);
});
it('should handle parsing of method statements grouped by brackets', function () {
it('should handle parsing of method statements grouped by brackets', function () {
const str =
'classDiagram\n' +
'class Dummy_Class {\n' +
@@ -121,6 +121,36 @@ describe('class diagram, ', function () {
parser.parse(str);
});
it('should handle return types on methods', function () {
const str =
'classDiagram\n' +
'Object <|-- ArrayList\n' +
'Object : equals()\n' +
'Object : -Object[] objects\n' +
'Object : +getObjects() Object[]\n' +
'ArrayList : Dummy elementData\n' +
'ArrayList : getDummy() Dummy';
parser.parse(str);
});
it('should handle return types on methods grouped by brackets', function () {
const str =
'classDiagram\n' +
'class Dummy_Class {\n' +
'string data\n' +
'getDummy() Dummy\n' +
'}\n' +
'\n' +
'class Flight {\n' +
' int flightNumber\n' +
' datetime departureTime\n' +
' getDepartureTime() datetime\n' +
'}';
parser.parse(str);
});
it('should handle parsing of separators', function () {
const str =
'classDiagram\n' +

View File

@@ -314,11 +314,24 @@ const drawClass = function(elem, classDef) {
const id = classDef.id;
const buildDisplayTextForMethod = function(txt) {
let regEx = /(\+|-|~|#)?(\w+)\((\w+\[?\]?)?\s?(\w+)?\)([*|$])?\s?(\w+\[?\]?)?/;
let cssStyle = '';
let methodEnd = txt.indexOf(')') + 1;
let methodName = txt.substring(0, methodEnd);
let displayText = txt;
let methodName = txt;
let classifier = '';
let classifier = txt.substring(methodEnd, methodEnd + 1);
let parsedText = txt.match(regEx);
if (parsedText) {
let visibility = parsedText[1] ? parsedText[1] : '';
methodName = parsedText[2] ? parsedText[2] : '';
let parameterType = parsedText[3] ? parsedText[3] : '';
let parameterName = parsedText[4] ? parsedText[4] : '';
classifier = parsedText[5] ? parsedText[5] : '';
let returnType = parsedText[6] ? ' : ' + parsedText[6] : '';
displayText =
visibility + methodName + '(' + parameterType + ' ' + parameterName + ')' + returnType;
}
switch (classifier) {
case '*':
@@ -331,19 +344,10 @@ const drawClass = function(elem, classDef) {
let method = {
methodname: methodName,
displayText: methodName,
displayText: displayText,
cssStyle: cssStyle
};
let returnTypeStart = txt.indexOf('[') + 1;
let returnTypeEnd = txt.indexOf(']');
if (returnTypeStart > 1 && returnTypeEnd > returnTypeStart) {
let returnType = txt.substring(returnTypeStart, returnTypeEnd);
method.displayText = methodName + ' : ' + returnType;
}
return method;
};