You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2017/10/19 14:13:38 UTC

svn commit: r1812644 - in /sling/trunk/bundles/scripting/sightly/java-compiler/src: main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ test/java/org/apache/sling/scripting/sightly/compiler/java/ test/resources/

Author: radu
Date: Thu Oct 19 14:13:38 2017
New Revision: 1812644

URL: http://svn.apache.org/viewvc?rev=1812644&view=rev
Log:
SLING-7205 - Generate import statements for data-sly-use Java use objects

* made sure the classes added to the import list are also used in the renderContext.call()
method to generate proper usage information in bytecode

Modified:
    sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java
    sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java
    sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java
    sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java
    sling/trunk/bundles/scripting/sightly/java-compiler/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java
    sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html
    sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html.java

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java Thu Oct 19 14:13:38 2017
@@ -117,7 +117,8 @@ public class CodeGenVisitor implements C
     @Override
     public void visit(VariableBinding.Start variableBinding) {
         source.startBlock();
-        TypeInfo typeInfo = TypeInference.inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports());
+        TypeInfo typeInfo = TypeInference
+                .inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer());
         Type type = typeInfo.typeOf(variableBinding.getExpression());
         String properName = declare(variableBinding.getVariableName(), type);
         source.beginAssignment(properName, type.getNativeClass());
@@ -125,7 +126,8 @@ public class CodeGenVisitor implements C
                 variableBinding.getExpression(),
                 source,
                 analyzer,
-                typeInfo);
+                typeInfo,
+                unitBuilder.getImports());
         source.endStatement();
     }
 
@@ -142,7 +144,8 @@ public class CodeGenVisitor implements C
 
     @Override
     public void visit(VariableBinding.Global globalAssignment) {
-        TypeInfo typeInfo = TypeInference.inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports());
+        TypeInfo typeInfo = TypeInference
+                .inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer());
         VariableDescriptor descriptor = analyzer.declareGlobal(globalAssignment.getVariableName());
         String name = descriptor.getAssignedName();
         source.append(name).assign();
@@ -150,7 +153,8 @@ public class CodeGenVisitor implements C
                 globalAssignment.getExpression(),
                 source,
                 analyzer,
-                typeInfo);
+                typeInfo,
+                unitBuilder.getImports());
         source.endStatement();
         String listCoercionVar = descriptor.getListCoercion();
         if (listCoercionVar != null) {

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java Thu Oct 19 14:13:38 2017
@@ -17,7 +17,9 @@
 package org.apache.sling.scripting.sightly.java.compiler.impl;
 
 import java.util.Map;
+import java.util.Set;
 
+import org.apache.sling.scripting.sightly.compiler.RuntimeFunction;
 import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode;
 import org.apache.sling.scripting.sightly.compiler.expression.SideEffectVisitor;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.ArrayLiteral;
@@ -33,6 +35,7 @@ import org.apache.sling.scripting.sightl
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperator;
+import org.apache.sling.scripting.sightly.java.compiler.JavaEscapeUtils;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen;
@@ -45,18 +48,21 @@ public final class ExpressionTranslator
     private final JavaSource source;
     private final VariableAnalyzer analyzer;
     private final TypeInfo typeInfo;
+    private final Set<String> imports;
 
-    private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo) {
+    private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo, Set<String> imports) {
         this.source = source;
         this.analyzer = analyzer;
         this.typeInfo= typeInfo;
+        this.imports = imports;
     }
 
     public static void buildExpression(ExpressionNode node,
                                        JavaSource source,
                                        VariableAnalyzer analyzer,
-                                       TypeInfo typeInfo) {
-        ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo);
+                                       TypeInfo typeInfo,
+                                       Set<String> imports) {
+        ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo, imports);
         builder.traverse(node);
     }
 
@@ -136,11 +142,27 @@ public final class ExpressionTranslator
 
     @Override
     public void visit(RuntimeCall runtimeCall) {
+        String runtimeCallName = runtimeCall.getFunctionName();
         source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RUNTIME_CALL_METHOD)
-                .stringLiteral(runtimeCall.getFunctionName());
+                .stringLiteral(runtimeCallName);
+        int index = 0;
         for (ExpressionNode arg : runtimeCall.getArguments()) {
             source.separateArgument();
-            visit(arg);
+            if (RuntimeFunction.USE.equals(runtimeCallName) && index == 0) {
+                if (arg instanceof StringConstant) {
+                    StringConstant constant = (StringConstant) arg;
+                    String className = constant.getText();
+                    if (imports.contains(className)) {
+                        source.className(className.substring(className.lastIndexOf('.') + 1));
+                    } else {
+                        visit(arg);
+                    }
+                } else {
+                    visit(arg);
+                }
+            } else {
+                visit(arg);
+            }
         }
         source.endCall();
     }

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java Thu Oct 19 14:13:38 2017
@@ -244,6 +244,14 @@ public class JavaSource {
         return startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RENDER_CONTEXT_GET_OBJECT_MODEL).endCall();
     }
 
+    public JavaSource property(String target, String property) {
+        return append(target).append(".").append(property);
+    }
+
+    public JavaSource className(String className) {
+        return property(className, "class").startCall("getName", true).endCall();
+    }
+
     private StringBuilder indent() {
         for (int i = 0; i < indentLevel; i++) {
             builder.append(INDENT);

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java Thu Oct 19 14:13:38 2017
@@ -37,6 +37,7 @@ import org.apache.sling.scripting.sightl
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.StringConstant;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation;
+import org.apache.sling.scripting.sightly.java.compiler.JavaImportsAnalyzer;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen;
@@ -49,18 +50,21 @@ public final class TypeInference impleme
     private final VariableAnalyzer analyzer;
     private final Map<ExpressionNode, Type> inferMap = new IdentityHashMap<>();
     private final Set<String> imports;
+    private final JavaImportsAnalyzer importsAnalyzer;
     private static final Pattern FQCN_PATTERN = Pattern.compile("([[\\p{L}&&[^\\p{Lu}]]_$][\\p{L}\\p{N}_$]*\\.)+[\\p{Lu}_$][\\p{L}\\p{N}_$]*");
 
 
-    public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports) {
-        TypeInference typeInference = new TypeInference(analyzer, imports);
+    public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports,
+                                      JavaImportsAnalyzer importsAnalyzer) {
+        TypeInference typeInference = new TypeInference(analyzer, imports, importsAnalyzer);
         typeInference.infer(node);
         return new TypeInfo(typeInference.inferMap);
     }
 
-    private TypeInference(VariableAnalyzer analyzer, Set<String> imports) {
+    private TypeInference(VariableAnalyzer analyzer, Set<String> imports, JavaImportsAnalyzer importsAnalyzer) {
         this.analyzer = analyzer;
         this.imports = imports;
+        this.importsAnalyzer = importsAnalyzer;
     }
 
 
@@ -138,7 +142,7 @@ public final class TypeInference impleme
             ExpressionNode identifier = runtimeCall.getArguments().get(0);
             if (identifier instanceof StringConstant) {
                 String objectType = ((StringConstant) identifier).getText();
-                if (FQCN_PATTERN.matcher(objectType).matches()) {
+                if (FQCN_PATTERN.matcher(objectType).matches() && importsAnalyzer != null && importsAnalyzer.allowImport(objectType)) {
                     imports.add(objectType);
                     return Type.dynamic(objectType);
                 }

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java Thu Oct 19 14:13:38 2017
@@ -103,6 +103,9 @@ public class JavaClassBackendCompilerTes
         String source = backendCompiler.build(classInfo);
         String expectedJavaOutput = IOUtils.toString(this.getClass().getResourceAsStream("/imports.html.java"), "UTF-8");
         assertEquals(expectedJavaOutput, source);
+        ClassLoader classLoader = JavaClassBackendCompilerTest.class.getClassLoader();
+        CharSequenceJavaCompiler<RenderUnit> compiler = new CharSequenceJavaCompiler<>(classLoader, null);
+        compiler.compile(classInfo.getFullyQualifiedClassName(), source);
     }
 
     private ClassInfo buildClassInfo(final String info) {

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html Thu Oct 19 14:13:38 2017
@@ -16,7 +16,7 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
-<div data-sly-use.slingSettings="org.apache.sling.settings.SlingSettingsService"
+<div data-sly-use.record="org.apache.sling.scripting.sightly.Record"
      data-sly-use.js="script.js"
      data-sly-use.pojo="Pojo"
 ></div>

Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html.java?rev=1812644&r1=1812643&r2=1812644&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html.java (original)
+++ sling/trunk/bundles/scripting/sightly/java-compiler/src/test/resources/imports.html.java Thu Oct 19 14:13:38 2017
@@ -25,7 +25,7 @@ import javax.script.Bindings;
 import org.apache.sling.scripting.sightly.java.compiler.RenderUnit;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 
-import org.apache.sling.settings.SlingSettingsService;
+import org.apache.sling.scripting.sightly.Record;
 
 
 public final class Test_imports extends RenderUnit {
@@ -37,11 +37,11 @@ public final class Test_imports extends
                                 RenderContext renderContext) {
 // Main Template Body -----------------------------------------------------------------------------
 
-Object _global_slingsettings = null;
+Object _global_record = null;
 Object _global_js = null;
 Object _global_pojo = null;
 out.write("\n");
-_global_slingsettings = renderContext.call("use", "org.apache.sling.settings.SlingSettingsService", obj());
+_global_record = renderContext.call("use", Record.class.getName(), obj());
 _global_js = renderContext.call("use", "script.js", obj());
 _global_pojo = renderContext.call("use", "Pojo", obj());
 out.write("<div></div>\n");