]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/annotations/AnnotationUtils.java
(refs #6923) Explicit export annotation for SCL modules
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / annotations / AnnotationUtils.java
index fb7334cd2b2cf52cdbd1faf85dc266b762af9bc8..08ea47297b7363bd8974c24154aa767b8e4d076b 100644 (file)
@@ -1,12 +1,39 @@
 package org.simantics.scl.compiler.elaboration.expressions.annotations;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import org.simantics.scl.compiler.constants.StringConstant;
+import org.simantics.scl.compiler.elaboration.expressions.EListLiteral;
 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
 import org.simantics.scl.compiler.elaboration.expressions.EStringLiteral;
 import org.simantics.scl.compiler.elaboration.expressions.EVar;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.errors.ErrorLog;
+import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst;
 
 public class AnnotationUtils {
+    /**
+     * Processes an annotation of form
+     * <pre>&#64;Annotation "text"</pre>
+     * or
+     * <pre>&#64;Annotation text</pre>
+     */
+    public static String processStringAnnotation(ErrorLog errorLog, DAnnotationAst annotation) {
+        if(annotation.parameters.length != 1)
+            errorLog.log(annotation.location, "Expected one string parameter for " + annotation.id.text);
+        String result = extractString(annotation.parameters[0]);
+        if(result == null)
+            errorLog.log(annotation.location, "Expected a string parameter for " + annotation.id.text);
+        return result;
+    }
+    
+    public static void processTagAnnotation(ErrorLog errorLog, DAnnotationAst annotation) {
+        if(annotation.parameters.length != 0)
+            errorLog.log(annotation.location, "Expected no parameters for " + annotation.id.text);
+    }
+    
     public static String extractString(Expression expression) {
         if(expression instanceof EVar)
             return ((EVar)expression).name;
@@ -24,4 +51,21 @@ public class AnnotationUtils {
         }
         return null;
     }
+    
+    public static List<EVar> extractIdentifierList(Expression expression) {
+        if(expression instanceof EVar || expression instanceof EStringLiteral || expression instanceof ELiteral)
+            return Collections.singletonList(new EVar(expression.location, extractString(expression)));
+        else if(expression instanceof EListLiteral) {
+            Expression[] components = ((EListLiteral)expression).getComponents();
+            EVar[] items = new EVar[components.length];
+            for(int i=0;i<components.length;++i) {
+                String value = extractString(components[i]);
+                if(value == null)
+                    return null;
+                items[i] = new EVar(components[i].location, value);
+            }
+            return Arrays.asList(items);
+        }
+        return null;
+    }
 }