From: Tuukka Lehtonen Date: Tue, 5 Dec 2017 20:54:51 +0000 (+0200) Subject: Merge "Potential fix for diagram scene graph screw-up regression" X-Git-Tag: v1.31.0~6 X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=commitdiff_plain;h=eae2657463e387cb764e7e5780d5c56f5311c0af;hp=694cdd2bbccb545e74d77befd83f1bdcb79bda5e Merge "Potential fix for diagram scene graph screw-up regression" --- diff --git a/bundles/org.simantics.modeling/scl/Simantics/Scenegraph.scl b/bundles/org.simantics.modeling/scl/Simantics/Scenegraph.scl index 5bf540e35..6a1ecd8fc 100644 --- a/bundles/org.simantics.modeling/scl/Simantics/Scenegraph.scl +++ b/bundles/org.simantics.modeling/scl/Simantics/Scenegraph.scl @@ -60,6 +60,10 @@ importJava "org.simantics.modeling.SCLScenegraph" where renderSVG :: ICanvasContext -> String + "Render an SVG with known width and height in pixels: `renderScaledSVG context width height`" + @JavaName renderSVG + renderScaledSVG :: ICanvasContext -> Double -> Double -> String + getSceneGraphProvider :: Diagram -> ICanvasSceneGraphProvider getSceneGraphProvider diagram = do diagramName = syncRead(\() -> getSafeName diagram) diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java index e0c198388..1e80b832d 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java @@ -422,20 +422,7 @@ public class SCLScenegraph { } - public static Element renderSVGNode(IG2DNode node) { - - // Get a DOMImplementation. - DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); - - // Create an instance of org.w3c.dom.Document. - String svgNS = "http://www.w3.org/2000/svg"; - Document document = domImpl.createDocument(svgNS, "svg", null); - - SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document); - ctx.setComment(null); - - // Create an instance of the SVG Generator. - SVGGraphics2D svgGenerator = new Generator(ctx, false); + public static Element renderSVGNode(SVGGraphics2D svgGenerator, IG2DNode node) { try { @@ -492,7 +479,11 @@ public class SCLScenegraph { } public static String renderSVG3(ICanvasContext ctx) { - return renderSVG0(ctx, p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2))); + return renderSVG3(ctx, -1, -1); + } + + public static String renderSVG3(ICanvasContext ctx, double width, double height) { + return renderSVG0(width, height, ctx, p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2))); } /** @@ -513,11 +504,19 @@ public class SCLScenegraph { * Default no-op mapper */ private static final Function1, Map> mapper = p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2)); - + + public static String renderSVG(ICanvasContext ctx, double width, double height) { + return renderSVG0(width, height, ctx, mapper); + } + public static String renderSVG(ICanvasContext ctx) { - return renderSVG0(ctx, mapper); + return renderSVG(ctx, -1, -1); } + public static String renderSVGMapIdentifiers(ICanvasContext ctx) { + return renderSVGMapIdentifiers(ctx, -1, -1); + } + /** * Renders ICanvasContext into SVG by mapping the SVG id's into URI based * GUID's @@ -525,8 +524,8 @@ public class SCLScenegraph { * @param ctx * @return */ - public static String renderSVGMapIdentifiers(ICanvasContext ctx) { - return renderSVG0(ctx, new Function1, Map>() { + public static String renderSVGMapIdentifiers(ICanvasContext ctx, double width, double height) { + return renderSVG0(width, height, ctx, new Function1, Map>() { @Override public Map apply(Set p0) { @@ -610,7 +609,7 @@ public class SCLScenegraph { } - private static String renderSVG0(ICanvasContext ctx, Function1, Map> mappingFunction) { + private static String renderSVG0(double width, double height, ICanvasContext ctx, Function1, Map> mappingFunction) { // Get a DOMImplementation. DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); @@ -642,48 +641,26 @@ public class SCLScenegraph { RTreeNode rtree = NodeUtil.getNearestChildByClass(root, RTreeNode.class); Rectangle2D rtreeBounds = NodeUtil.getLocalBounds(rtree); - // nav is a node that has zooming functionalities - NavigationNode nav = NodeUtil.getNearestChildByClass(root, NavigationNode.class); - nav.setZoomEnabled(true); - - // fit view with the contents of rtreeBounds - nav.zoomTo(rtreeBounds); - // get the bounds of the content - Rectangle2D content = NodeUtil.getLocalBounds(nav); - - svgGenerator.scale(3,3); - + Rectangle2D content = rtreeBounds; + + // To account for dynamic padding of selection rectangles (5 units + stroke width) + int offset = 6; + + double scale = width < 0 || height < 0 ? 1.0 : Math.min((width - 2*offset) / content.getWidth(), (height - 2*offset) / content.getHeight()); + + svgGenerator.translate(offset, offset); + svgGenerator.scale(scale, scale); // translate svgGenerator to the x and y coordinates of current content - svgGenerator.translate(-1 * content.getX(), (-1 * content.getY())); - - Rectangle2D destination = new Rectangle2D.Double(0,0,1000,1000); - double sx = destination.getWidth() / content.getWidth(); - double sy = destination.getHeight() / content.getHeight(); - double scale = sx < sy ? sx : sy; + svgGenerator.translate(-content.getX(), -content.getY()); - // Set svgCanvasSize to the given size parameters - svgGenerator.setSVGCanvasSize(new Dimension((int)(scale * content.getWidth()), (int)(scale * content.getHeight()))); - svgGenerator.setClip(content); - - double trX = -1 * content.getX(); - double trY = -1 * content.getY(); - - // NaNs - if(!Double.isFinite(trX)) trX = 0; - if(!Double.isFinite(trY)) trY = 0; + svgGenerator.setSVGCanvasSize(new Dimension((int)Math.ceil(scale * content.getWidth()) + 2*offset, (int)Math.ceil(scale * content.getHeight()) + 2*offset)); + //svgGenerator.setClip(content); result.append(MAIN_SECTION, ""); result.append(SELECTION_SECTION, ""); result.append(SELECTION_MASK_SECTION, ""); - result.append(ALL_SECTIONS, ""); - - KeyVisitor keyVisitor = new KeyVisitor(); sg.accept(keyVisitor); @@ -691,7 +668,7 @@ public class SCLScenegraph { Map mappings = mappingFunction.apply(keys); - IG2DNodeVisitor visitor = new PrintingVisitor(result, mappings); + IG2DNodeVisitor visitor = new PrintingVisitor(svgGenerator, result, mappings); sg.accept(visitor); @@ -700,7 +677,7 @@ public class SCLScenegraph { } - result.append(ALL_SECTIONS, ""); + result.append(ALL_SECTIONS, ""); StringBuilder res = new StringBuilder(); res.append(""); @@ -749,12 +726,14 @@ public class SCLScenegraph { HashMap senBuilders = new HashMap<>(); private RenderSVGContext result; + private SVGGraphics2D svgGenerator; private Map mappings; - public PrintingVisitor(RenderSVGContext result, Map mappings) { + public PrintingVisitor(SVGGraphics2D svgGenerator, RenderSVGContext result, Map mappings) { this.result = result; this.mappings = mappings; + this.svgGenerator = svgGenerator; } private String getKey(SingleElementNode node) { @@ -787,7 +766,7 @@ public class SCLScenegraph { parentBuilder.append(SELECTION_SECTION, "\n"); parentBuilder.append(SELECTION_MASK_SECTION, "\n"); - Element doc = renderSVGNode((IG2DNode)node); + Element doc = renderSVGNode(svgGenerator, (IG2DNode)node); String svg = printSVGDocument(doc); parentBuilder.append(MAIN_SECTION, svg); @@ -795,7 +774,7 @@ public class SCLScenegraph { n.setIgnoreSelection(false); } - doc = renderSVGNode((IG2DNode)node); + doc = renderSVGNode(svgGenerator, (IG2DNode)node); svg = printSVGDocument(doc); parentBuilder.append(SELECTION_SECTION, svg); @@ -805,7 +784,7 @@ public class SCLScenegraph { n.setDynamicStroke(bs); } - doc = renderSVGNode((IG2DNode)node); + doc = renderSVGNode(svgGenerator, (IG2DNode)node); svg = printSVGDocument(doc); parentBuilder.append(SELECTION_MASK_SECTION, svg); @@ -823,13 +802,17 @@ public class SCLScenegraph { String key = getKey(parentSEN); n.setIgnore(false); - Element doc = renderSVGNode((IG2DNode)node); + Element doc = renderSVGNode(svgGenerator, (IG2DNode)node); n.setIgnore(true); String svg = printSVGDocument(doc); parentBuilder2.append(SELECTION_SECTION, "\n"); parentBuilder2.append(SELECTION_SECTION, svg); parentBuilder2.append(SELECTION_SECTION, "\n"); - parentBuilder2.append(SELECTION_MASK_SECTION, "\n"); + AffineTransform transform = svgGenerator.getTransform(); + double[] matrix = new double[6]; + transform.getMatrix(matrix); + String matrixString = String.format("matrix(%f,%f,%f,%f,%f,%f)", matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); + parentBuilder2.append(SELECTION_MASK_SECTION, "\n"); Rectangle2D rect = n.getRect(); // NaN if(rect.getHeight() == rect.getHeight() && rect.getWidth() == rect.getWidth()) { @@ -900,12 +883,16 @@ public class SCLScenegraph { RenderSVGContext b = senBuilders.get(sen); String content = b.get(MAIN_SECTION); if(content.isEmpty()) { - for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) { - n.setIgnore(true); + if(sen.getKey() != null) { + + for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) { + n.setIgnore(true); + } + + Element doc = renderSVGNode(svgGenerator, (IG2DNode)node); + String svg = printSVGDocument(doc); + parentBuilder.append(MAIN_SECTION, svg); } - Element doc = renderSVGNode((IG2DNode)node); - String svg = printSVGDocument(doc); - parentBuilder.append(MAIN_SECTION, svg); } else { parentBuilder.append(b); } diff --git a/bundles/org.simantics.scl.compiler/META-INF/MANIFEST.MF b/bundles/org.simantics.scl.compiler/META-INF/MANIFEST.MF index 7f76ebc10..c36c46274 100644 --- a/bundles/org.simantics.scl.compiler/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.scl.compiler/META-INF/MANIFEST.MF @@ -63,6 +63,7 @@ Export-Package: org.cojen.classfile, org.simantics.scl.compiler.markdown.nodes, org.simantics.scl.compiler.module, org.simantics.scl.compiler.module.coverage, + org.simantics.scl.compiler.module.debug, org.simantics.scl.compiler.module.options, org.simantics.scl.compiler.module.repository, org.simantics.scl.compiler.runtime, diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl b/bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl new file mode 100644 index 000000000..5ab8e8141 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl @@ -0,0 +1,49 @@ +module { + features = [edo], + export = [whoCalls, unusedDefinitions] +} + +import "SCL/Reflection" + +@JavaType "org.simantics.scl.compiler.module.debug.SymbolReference" +data SymbolReference = + @JavaType "org.simantics.scl.compiler.module.debug.SymbolReference" + @FieldNames [referred, referrer, referenceLocation] + SymbolReference {referred :: Name, referrer :: String, referenceLocation :: Location} + +importJava "org.simantics.scl.compiler.module.debug.ModuleDebugInfo" where + data ModuleDebugInfo + + symbolReferences :: ModuleDebugInfo -> [SymbolReference] + +importJava "org.simantics.scl.compiler.module.Module" where + @JavaName "getModuleDebugInfo" + + debugInfo :: Module -> Maybe ModuleDebugInfo + +whoCalls :: String -> String -> [(String, String, Long)] +whoCalls moduleName valueName = + [ (callerModuleName, referrer, referenceLocation) + | callerModuleName <- sclModuleNames + , Just callerModule = moduleByName callerModuleName + , Just debugInfo = debugInfo callerModule + , SymbolReference {referred, referrer, referenceLocation} <- symbolReferences debugInfo + , referred == name + ] + where + name = createName moduleName valueName + +unusedDefinitions :: [Name] +unusedDefinitions = + [ createName moduleName def + | moduleName <- sclModuleNames + , Just module = moduleByName moduleName + , def <- valueNamesOf module + ] + \\ + [ referred + | callerModuleName <- sclModuleNames + , Just callerModule = moduleByName callerModuleName + , Just debugInfo = debugInfo callerModule + , SymbolReference {referred} <- symbolReferences debugInfo + ] \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/Reflection.scl b/bundles/org.simantics.scl.compiler/scl/SCL/Reflection.scl index cf8b88eea..6b2fd0bcd 100644 --- a/bundles/org.simantics.scl.compiler/scl/SCL/Reflection.scl +++ b/bundles/org.simantics.scl.compiler/scl/SCL/Reflection.scl @@ -1,5 +1,6 @@ module { - export = [possibleUnsafeSclValueByName, unsafeSclValueByName, sclModuleNames] + export = [possibleUnsafeSclValueByName, unsafeSclValueByName, sclModuleNames, moduleByName, + moduleOfName, nameOfName, createName, valueNamesOf] } include "SCL/ReflectionJava" @@ -11,11 +12,47 @@ importJava "org.simantics.scl.compiler.module.repository.ModuleRepository" where @JavaName getSourceRepository moduleSourceRepositoryOf :: ModuleRepository -> ModuleSourceRepository + @JavaName getModule + moduleByName_ :: ModuleRepository -> String -> Failable Module + importJava "org.simantics.scl.compiler.source.repository.ModuleSourceRepository" where data ModuleSourceRepository @JavaName getModuleNames sclModuleNames_ :: ModuleSourceRepository -> [String] + +importJava "org.simantics.scl.compiler.errors.Failable" where + data Failable a + + didSucceed :: Failable a -> Boolean + getResult :: Failable a -> Maybe a + +importJava "org.simantics.scl.compiler.module.Module" where + data Module + + @JavaName getValueNames + valueNamesOf_ :: Module -> [String] + +importJava "org.simantics.scl.compiler.common.names.Name" where + data Name + + @JavaName module + moduleOfName_ :: Name -> String + @JavaName name + nameOfName_ :: Name -> String + + @JavaName create + createName_ :: String -> String -> Name + +instance Show Name where + sb <+ n = sb << moduleOfName n << "/" << nameOfName n + +moduleOfName = moduleOfName_ +nameOfName = nameOfName_ +createName = createName_ +valueNamesOf = valueNamesOf_ + +type Location = Long unsafeSclValueByName :: String -> a unsafeSclValueByName = unsafeSclValueByName_ MODULE_REPOSITORY @@ -25,3 +62,8 @@ possibleUnsafeSclValueByName name = Just (unsafeSclValueByName name) `catch` \(_ sclModuleNames :: [String] sclModuleNames = sclModuleNames_ (moduleSourceRepositoryOf MODULE_REPOSITORY) + +moduleByName :: String -> Maybe Module +moduleByName name = getResult failable + where + failable = moduleByName_ MODULE_REPOSITORY name \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationContext.java index b9625af78..bd6546dac 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationContext.java @@ -13,6 +13,7 @@ import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; import org.simantics.scl.compiler.internal.codegen.utils.JavaNamingPolicy; import org.simantics.scl.compiler.internal.header.ModuleHeader; import org.simantics.scl.compiler.module.ConcreteModule; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; import org.simantics.scl.compiler.module.repository.ModuleRepository; import org.simantics.scl.compiler.types.Type; @@ -26,6 +27,7 @@ public class CompilationContext implements EnvironmentalContext { public JavaNamingPolicy namingPolicy; public ConcreteModule module; public ModuleHeader header; + public ModuleDebugInfo moduleDebugInfo; private THashMap valueCache = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java index 799b07268..ee21ef641 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java @@ -106,8 +106,10 @@ import org.simantics.scl.compiler.module.ConcreteModule; import org.simantics.scl.compiler.module.ImportDeclaration; import org.simantics.scl.compiler.module.InvalidModulePathException; import org.simantics.scl.compiler.module.ModuleUtils; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; import org.simantics.scl.compiler.module.repository.ImportFailure; import org.simantics.scl.compiler.module.repository.ImportFailureException; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.TForAll; import org.simantics.scl.compiler.types.TFun; @@ -1077,7 +1079,7 @@ public class Elaboration { final THashMap sections = new THashMap(); - final TranslationContext context = createTranslationContext(); + final TranslationContext context = createTranslationContext(ruleName); if(length > 0) { THashMap variables = context.getVariables(); for(TransformationRule extendsRule : extendsRules) { @@ -1228,7 +1230,7 @@ public class Elaboration { continue; try { SCLValue value = module.getValue(name); - TranslationContext context = createTranslationContext(); + TranslationContext context = createTranslationContext(name); Expression expression = context.translateCases2(defs); value.setExpression(expression); @@ -1245,7 +1247,7 @@ public class Elaboration { continue; try { SCLValue value = module.getValue(name); - TranslationContext context = createTranslationContext(); + TranslationContext context = createTranslationContext(name); Expression expression = context.translateCases2(defs); value.setExpression(expression); @@ -1279,13 +1281,13 @@ public class Elaboration { DRelationAst definition = definitions.get(0); ConcreteRelation relation = (ConcreteRelation)module.getRelation(name); relation.location = definition.location; - TranslationContext context = createTranslationContext(); + TranslationContext context = createTranslationContext(name); definition.translateTo(context, relation); } } - private TranslationContext createTranslationContext() { - return new TranslationContext(compilationContext, null); + private TranslationContext createTranslationContext(String definitionName) { + return new TranslationContext(compilationContext, null, definitionName); } private void handleAnnotation(SCLValue value, ArrayList defs, DAnnotationAst annotation) { @@ -1367,4 +1369,8 @@ public class Elaboration { branchPoints.put(valueName, injector.getAndClearBranchPoints()); } } + + public void collectDebugInfo() { + module.moduleDebugInfo = compilationContext.moduleDebugInfo = new ModuleDebugInfo(); + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java index cd43b76e1..0da48676a 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java @@ -82,6 +82,8 @@ public class SCLCompiler { declarations.relationDefinitionsAst); if(options.computeCoverage) elaboration.addCoverageBranchPoints(); + if(options.collectDebugInfo) + elaboration.collectDebugInfo(); // Elaboration if(hasErrors()) return; elaboration.addTypesToEnvironment( diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java index aeeb4cb55..b71c0ad27 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Arrays; import org.simantics.scl.compiler.common.names.Name; -import org.simantics.scl.compiler.common.names.Names; import org.simantics.scl.compiler.common.precedence.Associativity; import org.simantics.scl.compiler.common.precedence.Precedence; import org.simantics.scl.compiler.compilation.CompilationContext; @@ -33,6 +32,8 @@ import org.simantics.scl.compiler.environment.Namespace; import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; +import org.simantics.scl.compiler.module.debug.SymbolReference; import org.simantics.scl.compiler.top.SCLCompilerConfiguration; import org.simantics.scl.compiler.types.Type; @@ -77,6 +78,10 @@ public class TranslationContext extends TypeTranslationContext implements Enviro public CHRRuleset currentRuleset; + public ModuleDebugInfo moduleDebugInfo; + + private String definitionName; + static class Entry { String name; Variable variable; @@ -104,9 +109,11 @@ public class TranslationContext extends TypeTranslationContext implements Enviro } } - public TranslationContext(CompilationContext compilationContext, LocalEnvironment localEnvironment) { + public TranslationContext(CompilationContext compilationContext, LocalEnvironment localEnvironment, String definitionName) { super(compilationContext); this.localEnvironment = localEnvironment; + this.moduleDebugInfo = compilationContext.moduleDebugInfo; + this.definitionName = definitionName; } public static boolean isConstructorName(String name) { @@ -193,6 +200,8 @@ public class TranslationContext extends TypeTranslationContext implements Enviro String deprecatedDescription = value.isDeprecated(); if(deprecatedDescription != null) errorLog.logWarning(location, "Deprecated value " + value.getName().name + "." + (deprecatedDescription.isEmpty() ? "" : " " + deprecatedDescription)); + if(moduleDebugInfo != null) + moduleDebugInfo.symbolReferences.add(new SymbolReference(value.getName(), definitionName, location)); return new EConstant(location, value); } catch (AmbiguousNameException e) { if(SCLCompilerConfiguration.ALLOW_OVERLOADING) @@ -219,6 +228,8 @@ public class TranslationContext extends TypeTranslationContext implements Enviro public Expression realize() { EConstant expression = new EConstant(altValue); expression.location = location; + if(moduleDebugInfo != null) + moduleDebugInfo.symbolReferences.add(new SymbolReference(altValue.getName(), definitionName, location)); return expression; } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/ConcreteModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/ConcreteModule.java index e52420925..8a83e5f35 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/ConcreteModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/ConcreteModule.java @@ -5,7 +5,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.concurrent.SynchronousQueue; import java.util.function.Consumer; import org.simantics.scl.compiler.common.names.Name; @@ -23,6 +22,7 @@ import org.simantics.scl.compiler.elaboration.rules.TransformationRule; import org.simantics.scl.compiler.environment.filter.NamespaceFilter; import org.simantics.scl.compiler.errors.CompilationError; import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; import org.simantics.scl.compiler.top.ModuleInitializer; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.runtime.profiling.BranchPoint; @@ -55,6 +55,8 @@ public class ConcreteModule implements Module { ModuleInitializer moduleInitializer; protected Documentation documentation; + + public ModuleDebugInfo moduleDebugInfo; public ConcreteModule(String moduleName) { this.moduleName = moduleName; @@ -270,6 +272,11 @@ public class ConcreteModule implements Module { consumer.accept(value); }); } + + @Override + public List getValueNames() { + return new ArrayList(values.keySet()); + } public Collection getRelations() { return relations.values(); @@ -337,4 +344,9 @@ public class ConcreteModule implements Module { public void setDeprecation(String deprecation) { this.deprecation = deprecation; } + + @Override + public ModuleDebugInfo getModuleDebugInfo() { + return moduleDebugInfo; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/Module.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/Module.java index 6e6690fef..0ea33cb46 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/Module.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/Module.java @@ -1,5 +1,6 @@ package org.simantics.scl.compiler.module; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Consumer; @@ -15,9 +16,11 @@ import org.simantics.scl.compiler.elaboration.relations.SCLEntityType; import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.elaboration.rules.MappingRelation; import org.simantics.scl.compiler.elaboration.rules.TransformationRule; +import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.environment.filter.NamespaceFilter; import org.simantics.scl.compiler.errors.CompilationError; import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; import org.simantics.scl.compiler.top.ModuleInitializer; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.runtime.profiling.BranchPoint; @@ -30,6 +33,13 @@ public interface Module { String getDefaultLocalName(); SCLValue getValue(String name); + default List getValueNames() { + ArrayList valueNames = new ArrayList(); + findValuesForPrefix("", AcceptAllNamespaceFilter.INSTANCE, value -> { + valueNames.add(value.getName().name); + }); + return valueNames; + } List getFieldAccessors(String name); SCLRelation getRelation(String name); SCLEntityType getEntityType(String name); @@ -61,4 +71,11 @@ public interface Module { CompilationError[] getWarnings(); ClassLoader getParentClassLoader(); String getDeprecation(); + + /** + * May return null, if there is no debug info. + */ + default ModuleDebugInfo getModuleDebugInfo() { + return null; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/ModuleDebugInfo.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/ModuleDebugInfo.java new file mode 100644 index 000000000..a40daac32 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/ModuleDebugInfo.java @@ -0,0 +1,7 @@ +package org.simantics.scl.compiler.module.debug; + +import java.util.ArrayList; + +public class ModuleDebugInfo { + public final ArrayList symbolReferences = new ArrayList(); +} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/SymbolReference.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/SymbolReference.java new file mode 100644 index 000000000..a2bea8c59 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/debug/SymbolReference.java @@ -0,0 +1,15 @@ +package org.simantics.scl.compiler.module.debug; + +import org.simantics.scl.compiler.common.names.Name; + +public class SymbolReference { + public final Name referred; + public final String referrer; + public final long referenceLocation; + + public SymbolReference(Name referred, String referrer, long referenceLocation) { + this.referred = referred; + this.referrer = referrer; + this.referenceLocation = referenceLocation; + } +} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/options/ModuleCompilationOptions.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/options/ModuleCompilationOptions.java index 41c5f7763..90c9806ca 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/options/ModuleCompilationOptions.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/options/ModuleCompilationOptions.java @@ -10,6 +10,7 @@ public class ModuleCompilationOptions { public boolean computeCoverage; public boolean silent = false; + public boolean collectDebugInfo = false; public ModuleCompilationOptions(boolean computeCoverage) { this.computeCoverage = computeCoverage; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java index 899ee0418..36994d136 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java @@ -269,7 +269,7 @@ public class ExpressionEvaluator { // Elaboration { - TranslationContext context = new TranslationContext(compilationContext, localEnvironment); + TranslationContext context = new TranslationContext(compilationContext, localEnvironment, "expression"); expression = expression.resolve(context); if(!errorLog.hasNoErrors()) throw new SCLExpressionCompilationException(errorLog.getErrors()); diff --git a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/SCLOsgi.java b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/SCLOsgi.java index 59f8e5fd8..e6bddee7e 100644 --- a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/SCLOsgi.java +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/SCLOsgi.java @@ -2,9 +2,12 @@ package org.simantics.scl.osgi; import java.util.ArrayList; +import org.eclipse.core.internal.runtime.PlatformActivator; import org.simantics.scl.compiler.errors.DoesNotExist; import org.simantics.scl.compiler.errors.Failable; import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.options.ModuleCompilationOptions; +import org.simantics.scl.compiler.module.options.ModuleCompilationOptionsAdvisor; import org.simantics.scl.compiler.module.repository.ModuleRepository; import org.simantics.scl.compiler.source.repository.ModuleSourceRepository; import org.simantics.scl.compiler.testing.repository.TestRepository; @@ -23,6 +26,19 @@ public class SCLOsgi { public static ModuleRepository MODULE_REPOSITORY = new ModuleRepository(SOURCE_REPOSITORY); public static TestRepository TEST_REPOSITORY = new ServiceBasedTestRepository(Activator.getContext()); + static { + MODULE_REPOSITORY.setAdvisor(new ModuleCompilationOptionsAdvisor() { + ModuleCompilationOptions options = null; + @Override + public ModuleCompilationOptions getOptions(String moduleName) { + if(options == null) { + options = new ModuleCompilationOptions(false); + options.collectDebugInfo = Activator.getContext().getProperty("osgi.dev") != null; //$NON-NLS-1$ + } + return options; + } + }); + } public static String compileAllModules() { ArrayList modulesWithErrors = new ArrayList();