From 001af931fa2d1b113c755179274a914c7d9db05d Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Mon, 18 Mar 2019 18:11:05 +0100 Subject: [PATCH] remove some indirections and attribute usage when only serialization is used --- src/main/jastadd/Backend.jadd | 60 ++++++++++++------- .../org/jastadd/relast/compiler/Compiler.java | 5 +- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index b4d174d..012e232 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -871,8 +871,8 @@ aspect NameResolutionHelper { } public void TypeDecl.generateContextIndependentNameResolution(StringBuilder sb) { - sb.append(ind(1) + "// context-independent name resolution\n"); + sb.append(ind(1) + "uncache ASTNode.globallyResolve" + getID() + "ByToken(String id);\n"); sb.append(ind(1) + "syn " + getID() + " ASTNode.globallyResolve" + getID() + "ByToken(String id) {\n"); if (serializer) { sb.append(ind(2) + "return (" + getID() + ") globallyResolveASTNodeByUID(id);\n"); @@ -908,24 +908,36 @@ aspect NameResolutionHelper { generateDirectedContextDependentNameResolution(sb); } public void ManyRelationComponent.generateContextDependentNameResolution(StringBuilder sb) { - sb.append(ind(1) + "// context-dependent name resolution\n"); - sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n"); - sb.append(ind(2) + "// default to context-independent name resolution\n"); - sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n"); - sb.append(ind(1) + "}\n"); + System.out.println("serializer: " + serializer); + System.out.println("ResolverHelper: " + resolverHelper); + + if (serializer && !resolverHelper) { + sb.append(ind(1) + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n"); + sb.append(ind(2) + "return (" + ofTypeDecl() + ") globallyResolveASTNodeByUID(id);\n"); + sb.append(ind(1) + "}\n"); + } else { + sb.append(ind(1) + "// context-dependent name resolution\n"); + sb.append(ind(1) + "uncache " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position);\n"); + sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n"); + sb.append(ind(2) + "// default to context-independent name resolution\n"); + sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n"); + sb.append(ind(1) + "}\n"); + } } public void RelationComponent.generateDirectedContextDependentNameResolution(StringBuilder sb) { - // // context-dependent name resolution - // NamedElement A.resolveRel1(String id) { - // // default to context-independent name resolution - // return resolveNamedElement(id); - // } - sb.append(ind(1) + "// context-dependent name resolution\n"); - sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n"); - sb.append(ind(2) + "// default to context-independent name resolution\n"); - sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n"); - sb.append(ind(1) + "}\n"); + if (serializer && !resolverHelper) { + sb.append(ind(1) + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n"); + sb.append(ind(2) + "return (" + ofTypeDecl() + ") globallyResolveASTNodeByUID(id);\n"); + sb.append(ind(1) + "}\n"); + } else { + sb.append(ind(1) + "// context-dependent name resolution\n"); + sb.append(ind(1) + "uncache " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id);\n"); + sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n"); + sb.append(ind(2) + "// default to context-independent name resolution\n"); + sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n"); + sb.append(ind(1) + "}\n"); + } } public void Program.resolveAll(StringBuilder sb) { @@ -1345,13 +1357,15 @@ aspect Serializer { sb.append(ind(2) + "return null;\n"); sb.append(ind(1) + "}\n"); - sb.append(ind(1) + "syn ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n"); - sb.append(ind(2) + "if (getParent() == null) {\n"); - sb.append(ind(3) + "return __uidMap().get(uid);\n"); - sb.append(ind(2) + "} else {\n"); - sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n"); - sb.append(ind(2) + "}\n"); - sb.append(ind(1) + "}\n"); + if (serializer) { + sb.append(ind(1) + "ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n"); + sb.append(ind(2) + "if (getParent() == null) {\n"); + sb.append(ind(3) + "return __uidMap().get(uid);\n"); + sb.append(ind(2) + "} else {\n"); + sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n"); + sb.append(ind(2) + "}\n"); + sb.append(ind(1) + "}\n"); + } sb.append(ind(1) + "syn java.util.Map<String, ASTNode> ASTNode.__uidMap() {\n"); sb.append(ind(2) + "return(__uidMap(new java.util.HashMap()));\n"); diff --git a/src/main/java/org/jastadd/relast/compiler/Compiler.java b/src/main/java/org/jastadd/relast/compiler/Compiler.java index 9100db9..124aed2 100644 --- a/src/main/java/org/jastadd/relast/compiler/Compiler.java +++ b/src/main/java/org/jastadd/relast/compiler/Compiler.java @@ -89,8 +89,11 @@ public class Compiler { } } - if (optionResolverHelper.isSet() || optionSerializer.isSet()) { + if (optionResolverHelper.isSet()) { ASTNode.resolverHelper = true; + } + + if (optionResolverHelper.isSet() || optionSerializer.isSet()) { writeToFile(grammarName + "ResolverStubs.jrag", p.generateResolverStubs()); } -- GitLab