diff --git a/demos/classchart.html b/demos/classchart.html
index 031f3b608..84cc7bec5 100644
--- a/demos/classchart.html
+++ b/demos/classchart.html
@@ -138,7 +138,20 @@ title: Demo Class Diagram
Pineapple : -int leafCount()
Pineapple : -int spikeCount()
+
+
+ classDiagram
+ class Person {
+ +Id : Guid
+ +FirstName : string
+ +LastName : string
+ -privateProperty : string
+ #ProtectedProperty : string
+ ~InternalProperty : string
+ ~AnotherInternalProperty : List~MyType~
+ }
+
diff --git a/packages/mermaid/src/diagrams/common/common.spec.js b/packages/mermaid/src/diagrams/common/common.spec.js
index 68f5138e7..3ebe8b1d6 100644
--- a/packages/mermaid/src/diagrams/common/common.spec.js
+++ b/packages/mermaid/src/diagrams/common/common.spec.js
@@ -68,5 +68,6 @@ describe('generic parser', function () {
expect(parseGenericTypes('test ~Array~Array~string[]~~~')).toEqual(
'test >>'
);
+ expect(parseGenericTypes('~test')).toEqual('~test');
});
});
diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts
index 628908aab..d34a2df68 100644
--- a/packages/mermaid/src/diagrams/common/common.ts
+++ b/packages/mermaid/src/diagrams/common/common.ts
@@ -154,11 +154,17 @@ export const evaluate = (val?: string | boolean): boolean =>
export const parseGenericTypes = function (text: string): string {
let cleanedText = text;
- if (text.includes('~')) {
- cleanedText = cleanedText.replace(/~([^~].*)/, '<$1');
- cleanedText = cleanedText.replace(/~([^~]*)$/, '>$1');
+ if (text.split('~').length - 1 >= 2) {
+ let newCleanedText = cleanedText;
- return parseGenericTypes(cleanedText);
+ // use a do...while loop instead of replaceAll to detect recursion
+ // e.g. Array~Array~T~~
+ do {
+ cleanedText = newCleanedText;
+ newCleanedText = cleanedText.replace(/~([^\s,:;]+)~/, '<$1>');
+ } while (newCleanedText != cleanedText);
+
+ return parseGenericTypes(newCleanedText);
} else {
return cleanedText;
}