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");