Better logic in DefaultComponentClassNodeResolver.
This commit is contained in:
parent
8b3dc7a476
commit
0f14cec9c5
@ -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(
|
||||||
|
@ -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);
|
||||||
|
@ -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(
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user