Better logic in DefaultComponentClassNodeResolver.

This commit is contained in:
JesseBrault0709 2024-05-07 13:07:55 +02:00
parent 8b3dc7a476
commit 0f14cec9c5
4 changed files with 25 additions and 7 deletions

View File

@ -5,6 +5,7 @@ import groowt.view.component.*;
import groowt.view.component.context.*; import groowt.view.component.context.*;
import groowt.view.web.ast.node.*; import groowt.view.web.ast.node.*;
import groowt.view.web.runtime.WebViewComponentChildCollection; import groowt.view.web.runtime.WebViewComponentChildCollection;
import groowt.view.web.transpile.resolve.ComponentClassNodeResolver;
import groowt.view.web.transpile.util.GroovyUtil; import groowt.view.web.transpile.util.GroovyUtil;
import groowt.view.web.transpile.util.GroovyUtil.ConvertResult; import groowt.view.web.transpile.util.GroovyUtil.ConvertResult;
import org.codehaus.groovy.ast.*; import org.codehaus.groovy.ast.*;
@ -46,6 +47,7 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
private ValueNodeTranspiler valueNodeTranspiler; private ValueNodeTranspiler valueNodeTranspiler;
private BodyTranspiler bodyTranspiler; private BodyTranspiler bodyTranspiler;
private AppendOrAddStatementFactory appendOrAddStatementFactory; private AppendOrAddStatementFactory appendOrAddStatementFactory;
private ComponentClassNodeResolver componentClassNodeResolver;
public void setValueNodeTranspiler(ValueNodeTranspiler valueNodeTranspiler) { public void setValueNodeTranspiler(ValueNodeTranspiler valueNodeTranspiler) {
this.valueNodeTranspiler = valueNodeTranspiler; this.valueNodeTranspiler = valueNodeTranspiler;
@ -59,6 +61,10 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
this.appendOrAddStatementFactory = appendOrAddStatementFactory; this.appendOrAddStatementFactory = appendOrAddStatementFactory;
} }
public void setComponentClassNodeResolver(ComponentClassNodeResolver componentClassNodeResolver) {
this.componentClassNodeResolver = componentClassNodeResolver;
}
// ViewComponent c0 // ViewComponent c0
protected ExpressionStatement getComponentDeclaration(Variable component) { protected ExpressionStatement getComponentDeclaration(Variable component) {
final var componentDeclaration = new DeclarationExpression( final var componentDeclaration = new DeclarationExpression(

View File

@ -6,7 +6,7 @@ import org.jetbrains.annotations.Nullable;
public interface ComponentClassNodeResolver { public interface ComponentClassNodeResolver {
record ClassNodeResolveError(ClassIdentifier identifier, String getMessage, @Nullable Throwable getCause) {} record ClassNodeResolveError(ClassIdentifier identifier, String message, @Nullable Throwable cause) {}
Either<ClassNodeResolveError, ClassNode> getClassForFqn(String fqn); Either<ClassNodeResolveError, ClassNode> getClassForFqn(String fqn);
Either<ClassNodeResolveError, ClassNode> getClassForNameWithoutPackage(String nameWithoutPackage); Either<ClassNodeResolveError, ClassNode> getClassForNameWithoutPackage(String nameWithoutPackage);

View File

@ -135,8 +135,21 @@ public class DefaultComponentClassNodeResolver implements ComponentClassNodeReso
final var classLoaderResolved = this.resolveWithClassLoader(identifier); final var classLoaderResolved = this.resolveWithClassLoader(identifier);
if (classLoaderResolved.isRight()) { if (classLoaderResolved.isRight()) {
this.addToCache(identifier, classLoaderResolved.asRight().get()); this.addToCache(identifier, classLoaderResolved.asRight().get());
}
return classLoaderResolved; return classLoaderResolved;
} else {
// Return the left only if we had an error that we weren't possibly expecting.
final Throwable cause = classLoaderResolved.asLeft().get().cause();
if (!(cause instanceof ClassNotFoundException)) {
return classLoaderResolved;
}
}
// We have a fqn which is outside the expected packages/classpath
// Make a custom class node and hope that the groovy compiler
// can resolve it later.
final ClassNode classNode = ClassHelper.make(fqn);
this.addToCache(new ClassIdentifierWithFqn(getAlias(fqn), fqn), classNode);
return Either.right(classNode);
} }
@Override @Override
@ -148,7 +161,7 @@ public class DefaultComponentClassNodeResolver implements ComponentClassNodeReso
return Either.right(fromCache); return Either.right(fromCache);
} }
// try imports // try given imports (not from compilation customizer)
final var importedClassNode = this.moduleNode.getImportType(nameWithoutPackage); final var importedClassNode = this.moduleNode.getImportType(nameWithoutPackage);
if (importedClassNode != null) { if (importedClassNode != null) {
this.addToCache( this.addToCache(

View File

@ -2,7 +2,7 @@ package groowt.view.web.tools
import groovy.transform.InheritConstructors import groovy.transform.InheritConstructors
import groovy.transform.MapConstructor import groovy.transform.MapConstructor
import groowt.view.web.analysis.MismatchedComponentTypeAnalyzer import groowt.view.web.analysis.MismatchedComponentTypeErrorAnalysis
import groowt.view.web.antlr.AntlrUtil import groowt.view.web.antlr.AntlrUtil
import groowt.view.web.antlr.ParserUtil import groowt.view.web.antlr.ParserUtil
import groowt.view.web.antlr.TokenList import groowt.view.web.antlr.TokenList
@ -96,12 +96,11 @@ final class AstFileMaker extends AbstractTreeFileMaker {
) )
} }
def mismatchedTypeAnalyzer = new MismatchedComponentTypeAnalyzer() def mismatchedTypeErrors = MismatchedComponentTypeErrorAnalysis.check(cuContext)
def mismatchedTypeErrors = mismatchedTypeAnalyzer.analyze(cuContext)
if (!mismatchedTypeErrors.isEmpty()) { if (!mismatchedTypeErrors.isEmpty()) {
def message = 'There were mismatched type errors: \n' + mismatchedTypeErrors.collect { def message = 'There were mismatched type errors: \n' + mismatchedTypeErrors.collect {
it.message() it.getMessage()
}.join('\n') }.join('\n')
return new BuildFailure( return new BuildFailure(
compilationUnitContext: cuContext, compilationUnitContext: cuContext,