From 2a1b2a18e8fb7c2f3daccfd4c7fef93e3ec5c88a Mon Sep 17 00:00:00 2001 From: Pieter12345 Date: Tue, 26 Mar 2024 00:19:17 +0100 Subject: [PATCH] Move unresolved type errors to compile time when SA is disabled --- .../laytonsmith/core/functions/Compiler.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/laytonsmith/core/functions/Compiler.java b/src/main/java/com/laytonsmith/core/functions/Compiler.java index 664ea906f..258821b07 100644 --- a/src/main/java/com/laytonsmith/core/functions/Compiler.java +++ b/src/main/java/com/laytonsmith/core/functions/Compiler.java @@ -11,6 +11,7 @@ import com.laytonsmith.core.ParseTree; import com.laytonsmith.core.Script; import com.laytonsmith.core.compiler.FileOptions; +import com.laytonsmith.core.compiler.analysis.StaticAnalysis; import com.laytonsmith.core.constructs.CBareString; import com.laytonsmith.core.constructs.CBracket; import com.laytonsmith.core.constructs.CClassType; @@ -745,7 +746,7 @@ public ParseTree postParseRewrite(ParseTree ast, Environment env, @api @noprofile @hide("This is only used internally by the compiler.") - public static class __type_ref__ extends DummyFunction { + public static class __type_ref__ extends DummyFunction implements Optimizable { public static final String NAME = "__type_ref__"; @@ -786,6 +787,29 @@ public static ParseTree createASTNode(String typeName, Target t, FileOptions fil node.addChild(new ParseTree(new CString(typeName, t), fileOptions, true)); return node; } + + @Override + public Set optimizationOptions() { + return EnumSet.of(OptimizationOption.OPTIMIZE_DYNAMIC); + } + + @Override + public ParseTree optimizeDynamic(Target t, Environment env, + Set> envs, + List children, FileOptions fileOptions) + throws ConfigCompileException, ConfigRuntimeException { + + /* + * With static analysis enabled, the typechecker has already taken care of this AST node. + * Until MethodScript supports user types, we know that custom types cannot be resolved regardless of the + * outcome of static analysis. So we can generate an exception here until user type support is added. + */ + if(!StaticAnalysis.enabled()) { + throw new ConfigCompileException( + "\"" + children.get(0).getData().val() + "\" cannot be resolved to a type.", t); + } + return null; + } } @api