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.web.ast.node.*;
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.ConvertResult;
import org.codehaus.groovy.ast.*;
@ -46,6 +47,7 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
private ValueNodeTranspiler valueNodeTranspiler;
private BodyTranspiler bodyTranspiler;
private AppendOrAddStatementFactory appendOrAddStatementFactory;
private ComponentClassNodeResolver componentClassNodeResolver;
public void setValueNodeTranspiler(ValueNodeTranspiler valueNodeTranspiler) {
this.valueNodeTranspiler = valueNodeTranspiler;
@ -59,6 +61,10 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
this.appendOrAddStatementFactory = appendOrAddStatementFactory;
}
public void setComponentClassNodeResolver(ComponentClassNodeResolver componentClassNodeResolver) {
this.componentClassNodeResolver = componentClassNodeResolver;
}
// ViewComponent c0
protected ExpressionStatement getComponentDeclaration(Variable component) {
final var componentDeclaration = new DeclarationExpression(

View File

@ -6,7 +6,7 @@ import org.jetbrains.annotations.Nullable;
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> getClassForNameWithoutPackage(String nameWithoutPackage);

View File

@ -135,8 +135,21 @@ public class DefaultComponentClassNodeResolver implements ComponentClassNodeReso
final var classLoaderResolved = this.resolveWithClassLoader(identifier);
if (classLoaderResolved.isRight()) {
this.addToCache(identifier, classLoaderResolved.asRight().get());
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;
}
}
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
@ -148,7 +161,7 @@ public class DefaultComponentClassNodeResolver implements ComponentClassNodeReso
return Either.right(fromCache);
}
// try imports
// try given imports (not from compilation customizer)
final var importedClassNode = this.moduleNode.getImportType(nameWithoutPackage);
if (importedClassNode != null) {
this.addToCache(

View File

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