--- /dev/null
+package org.simantics.scl.compiler.internal.parsing.declarations;\r
+\r
+\r
+public class DDocumentationAst extends DeclarationAst {\r
+ public final String documentation;\r
+ \r
+ public DDocumentationAst(String documentation) {\r
+ this.documentation = cleanUp(documentation);\r
+ }\r
+\r
+ @Override\r
+ public void toString(int indentation, StringBuilder b) {\r
+ for(int i=0;i<indentation;++i) b.append(" ");\r
+ b.append("\"\"\"\n");\r
+ b.append(documentation);\r
+ b.append("\"\"\"\n");\r
+ \r
+ }\r
+ \r
+ private static String cleanUp(String documentation) {\r
+ // Remove empty lines\r
+ int end = documentation.length();\r
+ while(end > 0) {\r
+ char c = documentation.charAt(end-1);\r
+ if(c != ' ' && c != '\n')\r
+ break;\r
+ --end;\r
+ }\r
+ \r
+ int begin = 0;\r
+ for(int i=0;i<end;++i) {\r
+ char c = documentation.charAt(i);\r
+ if(c == '\n')\r
+ begin = i+1;\r
+ else if(c != ' ')\r
+ break;\r
+ }\r
+ \r
+ // Calculate common indentation\r
+ int lineStart = begin;\r
+ int commonIndentation = Integer.MAX_VALUE;\r
+ for(int i=begin;i<end;++i) {\r
+ char c = documentation.charAt(i);\r
+ if(c == '\n') {\r
+ lineStart = i+1;\r
+ }\r
+ else if(lineStart >= 0 && c != ' ') {\r
+ int indentation = i - lineStart;\r
+ commonIndentation = Math.min(commonIndentation, indentation);\r
+ if(commonIndentation == 0) {\r
+ if(begin == 0 && end == documentation.length())\r
+ return documentation;\r
+ else\r
+ return documentation.substring(begin, end);\r
+ }\r
+ lineStart = -1;\r
+ }\r
+ }\r
+ \r
+ // Remove common indentation\r
+ StringBuilder result = new StringBuilder();\r
+ int charsToSkip = commonIndentation;\r
+ for(int i=begin;i<end;++i) {\r
+ char c = documentation.charAt(i);\r
+ if(c == '\n') {\r
+ result.append(c);\r
+ charsToSkip = commonIndentation;\r
+ continue;\r
+ }\r
+ if(charsToSkip > 0)\r
+ --charsToSkip;\r
+ else\r
+ result.append(c);\r
+ }\r
+ return result.toString();\r
+ }\r
+}\r