Skip to content

Commit

Permalink
TemplateExtension match any support
Browse files Browse the repository at this point in the history
Signed-off-by: azerr <azerr@redhat.com>
  • Loading branch information
angelozerr committed Oct 18, 2024
1 parent 5ea83f1 commit 4bc8ce5
Show file tree
Hide file tree
Showing 10 changed files with 962 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -247,17 +247,49 @@ private CompletableFuture<CompletionList> doCompleteExpressionForMemberPart(Part
}
Part previousPart = parts.getPreviousPart(part);
return project.resolveJavaType(previousPart) //
.thenApply(resolvedType -> {
.thenCompose(resolvedType -> {
cancelChecker.checkCanceled();

if (!isValidJavaType(resolvedType)) {
return EMPTY_COMPLETION;
Part p = parts.getPreviousPart(previousPart);
if (p != null) {
return project.resolveJavaType(p) //
.thenCompose(resolvedType2 -> {
cancelChecker.checkCanceled();
if (resolvedType2 == null) {
return EMPTY_FUTURE_COMPLETION;
}
List<MethodValueResolver> resolvers = project.getResolversFor(resolvedType2);
for (MethodValueResolver method : resolvers) {
if (ValueResolver.MATCH_NAME_ANY.equals(method.getMatchName())
&& !method.isVoidMethod()) {
String returnType = method.getReturnType();
return project.resolveJavaType(returnType) //
.thenApply(r -> {
cancelChecker.checkCanceled();
if (r == null) {
return EMPTY_COMPLETION;
}
return doCompleteForJavaTypeMembers(r, start, end, template,
project,
infixNotation, completionSettings,
formattingSettings,
nativeImagesSettings);
});
}
}
return EMPTY_FUTURE_COMPLETION;
});
}
;
return EMPTY_FUTURE_COMPLETION;
}

// Completion for member of the given Java class
// ex : org.acme.Item
return doCompleteForJavaTypeMembers(resolvedType, start, end, template, project,
infixNotation, completionSettings, formattingSettings, nativeImagesSettings);
return CompletableFuture
.completedFuture(doCompleteForJavaTypeMembers(resolvedType, start, end, template, project,
infixNotation, completionSettings, formattingSettings, nativeImagesSettings));
});

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package com.redhat.qute.project;

import java.util.Arrays;
import java.util.List;

import com.redhat.qute.commons.InvalidMethodReason;
import com.redhat.qute.commons.JavaTypeInfo;
import com.redhat.qute.commons.JavaTypeKind;
import com.redhat.qute.commons.ProjectInfo;
import com.redhat.qute.commons.ResolvedJavaTypeInfo;

public abstract class BaseQuteProject extends MockQuteProject {

public BaseQuteProject(ProjectInfo projectInfo, QuteProjectRegistry projectRegistry) {
super(projectInfo, projectRegistry);
}

@Override
protected void fillJavaTypes(List<JavaTypeInfo> cache) {
createJavaTypeInfo("java.util.List<E>", JavaTypeKind.Interface, cache);
createJavaTypeInfo("java.util.Map<K,V>", JavaTypeKind.Interface, cache);
}

@Override
protected void fillResolvedJavaTypes(List<ResolvedJavaTypeInfo> resolvedJavaTypes) {
createBinaryTypes(resolvedJavaTypes);
}

private void createBinaryTypes(List<ResolvedJavaTypeInfo> cache) {
// Java type primitives
createResolvedJavaTypeInfo("java.lang.Object", cache, true);
createResolvedJavaTypeInfo("java.lang.Boolean", cache, true);
createResolvedJavaTypeInfo("java.lang.Integer", cache, true);
createResolvedJavaTypeInfo("java.lang.Double", cache, true);
createResolvedJavaTypeInfo("java.lang.Long", cache, true);
createResolvedJavaTypeInfo("java.lang.Float", cache, true);
createResolvedJavaTypeInfo("java.math.BigDecimal", cache, true);

// String
ResolvedJavaTypeInfo string = createResolvedJavaTypeInfo("java.lang.String", cache, true);
registerField("UTF16 : byte", string);
registerMethod("isEmpty() : boolean", string);
registerMethod("codePointCount(beginIndex : int,endIndex : int) : int", string);
string.setInvalidMethod("getChars", InvalidMethodReason.VoidReturn); // void getChars(int srcBegin, int srcEnd,
// char dst[], int dstBegin)
registerMethod("charAt(index : int) : char", string);
registerMethod("getBytes(charsetName : java.lang.String) : byte[]", string);
registerMethod("getBytes() : byte[]", string);

// BigInteger
ResolvedJavaTypeInfo bigInteger = createResolvedJavaTypeInfo("java.math.BigInteger", cache, true);
registerMethod("divide(val : java.math.BigInteger) : java.math.BigInteger", bigInteger);

// Iterator
ResolvedJavaTypeInfo iterator = createResolvedJavaTypeInfo("java.util.Iterator<E>", cache, true);
registerMethod("hasNext() : boolean", iterator);
registerMethod("next() : E", iterator);

// Iterable
ResolvedJavaTypeInfo iterable = createResolvedJavaTypeInfo("java.lang.Iterable<T>", cache, true);
registerMethod("iterator() : java.util.Iterator<T>", iterable);

// Collection
ResolvedJavaTypeInfo collection = createResolvedJavaTypeInfo("java.util.Collection<E>", cache, true);
collection.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// List
ResolvedJavaTypeInfo list = createResolvedJavaTypeInfo("java.util.List<E>", cache, true);
list.setExtendedTypes(Arrays.asList("java.util.Collection<E>"));
registerMethod("size() : int", list);
registerMethod("get(index : int) : E", list);
registerMethod("subList(fromIndex : int, toIndex: int) : java.util.List<E>", list);

// Set
ResolvedJavaTypeInfo set = createResolvedJavaTypeInfo("java.util.Set<E>", cache, true);
set.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// Map
ResolvedJavaTypeInfo map = createResolvedJavaTypeInfo("java.util.Map<K,V>", cache, true);
registerMethod("keySet() : java.util.Set<K>", map);
registerMethod("values() : java.util.Collection<V>", map);
registerMethod("entrySet() : java.util.Set<java.util.Map$Entry<K,V>>", map);
registerMethod("get(key : K) : V", map);

// Map.Entry
ResolvedJavaTypeInfo mapEntry = createResolvedJavaTypeInfo("java.util.Map$Entry<K,V>", cache, true);
registerMethod("getKey() : K", mapEntry);
registerMethod("getValue() : V", mapEntry);

// AbstractMap
ResolvedJavaTypeInfo abstractMap = createResolvedJavaTypeInfo("java.util.AbstractMap<K,V>", cache, true);
abstractMap.setExtendedTypes(Arrays.asList("java.util.Map<K,V>"));

// HashMap
ResolvedJavaTypeInfo hashMap = createResolvedJavaTypeInfo("java.util.HashMap<K,V>", cache, true);
hashMap.setExtendedTypes(Arrays.asList("java.util.AbstractMap<K,V>", "java.util.Map<K,V>"));

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
createResolvedJavaTypeInfo("java.util.concurrent.CompletionStage<T>", cache, true);
ResolvedJavaTypeInfo completableFuture = createResolvedJavaTypeInfo("java.util.concurrent.CompletableFuture<T>",
cache, true);
completableFuture.setExtendedTypes(Arrays.asList("java.util.concurrent.CompletionStage<T>"));
createResolvedJavaTypeInfo("io.smallrye.mutiny.Uni<T>", cache, true);
ResolvedJavaTypeInfo asyncResultUni = createResolvedJavaTypeInfo("io.smallrye.mutiny.vertx.AsyncResultUni<T>",
cache, true);
asyncResultUni.setExtendedTypes(Arrays.asList("io.smallrye.mutiny.Uni<T>"));

// RawString for raw and safe resolver tests
ResolvedJavaTypeInfo rawString = createResolvedJavaTypeInfo("io.quarkus.qute.RawString", cache, true);
registerMethod("getValue() : java.lang.String", rawString);
registerMethod("toString() : java.lang.String", rawString);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.redhat.qute.commons.usertags.UserTagInfo;
import com.redhat.qute.project.multiple.QuteProjectA;
import com.redhat.qute.project.multiple.QuteProjectB;
import com.redhat.qute.project.roq.RoqProject;

public class MockQuteProjectRegistry extends QuteProjectRegistry {

Expand Down Expand Up @@ -64,6 +65,9 @@ protected QuteProject createProject(ProjectInfo projectInfo) {
if (QuteProjectB.PROJECT_URI.equals(projectInfo.getUri())) {
return new QuteProjectB(this);
}
if (RoqProject.PROJECT_URI.equals(projectInfo.getUri())) {
return new RoqProject(projectInfo, this);
}
return super.createProject(projectInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import com.redhat.qute.commons.InvalidMethodReason;
import com.redhat.qute.commons.JavaMemberInfo;
import com.redhat.qute.commons.JavaMethodInfo;
import com.redhat.qute.commons.JavaTypeInfo;
import com.redhat.qute.commons.JavaTypeKind;
import com.redhat.qute.commons.ProjectInfo;
import com.redhat.qute.commons.ResolvedJavaTypeInfo;
Expand All @@ -42,7 +41,7 @@
* @author Angelo ZERR
*
*/
public class QuteQuickStartProject extends MockQuteProject {
public class QuteQuickStartProject extends BaseQuteProject {

public final static String PROJECT_URI = "qute-quickstart";

Expand All @@ -56,95 +55,9 @@ public QuteQuickStartProject(ProjectInfo projectInfo, QuteProjectRegistry projec

@Override
protected void fillResolvedJavaTypes(List<ResolvedJavaTypeInfo> cache) {
createBinaryTypes(cache);
super.fillResolvedJavaTypes(cache);
createSourceTypes(cache);
}

private void createBinaryTypes(List<ResolvedJavaTypeInfo> cache) {
// Java type primitives
createResolvedJavaTypeInfo("java.lang.Object", cache, true);
createResolvedJavaTypeInfo("java.lang.Boolean", cache, true);
createResolvedJavaTypeInfo("java.lang.Integer", cache, true);
createResolvedJavaTypeInfo("java.lang.Double", cache, true);
createResolvedJavaTypeInfo("java.lang.Long", cache, true);
createResolvedJavaTypeInfo("java.lang.Float", cache, true);
createResolvedJavaTypeInfo("java.math.BigDecimal", cache, true);

// String
ResolvedJavaTypeInfo string = createResolvedJavaTypeInfo("java.lang.String", cache, true);
registerField("UTF16 : byte", string);
registerMethod("isEmpty() : boolean", string);
registerMethod("codePointCount(beginIndex : int,endIndex : int) : int", string);
string.setInvalidMethod("getChars", InvalidMethodReason.VoidReturn); // void getChars(int srcBegin, int srcEnd,
// char dst[], int dstBegin)
registerMethod("charAt(index : int) : char", string);
registerMethod("getBytes(charsetName : java.lang.String) : byte[]", string);
registerMethod("getBytes() : byte[]", string);

// BigInteger
ResolvedJavaTypeInfo bigInteger = createResolvedJavaTypeInfo("java.math.BigInteger", cache, true);
registerMethod("divide(val : java.math.BigInteger) : java.math.BigInteger", bigInteger);

// Iterator
ResolvedJavaTypeInfo iterator = createResolvedJavaTypeInfo("java.util.Iterator<E>", cache, true);
registerMethod("hasNext() : boolean", iterator);
registerMethod("next() : E", iterator);

// Iterable
ResolvedJavaTypeInfo iterable = createResolvedJavaTypeInfo("java.lang.Iterable<T>", cache, true);
registerMethod("iterator() : java.util.Iterator<T>", iterable);

// Collection
ResolvedJavaTypeInfo collection = createResolvedJavaTypeInfo("java.util.Collection<E>", cache, true);
collection.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// List
ResolvedJavaTypeInfo list = createResolvedJavaTypeInfo("java.util.List<E>", cache, true);
list.setExtendedTypes(Arrays.asList("java.util.Collection<E>"));
registerMethod("size() : int", list);
registerMethod("get(index : int) : E", list);
registerMethod("subList(fromIndex : int, toIndex: int) : java.util.List<E>", list);

// Set
ResolvedJavaTypeInfo set = createResolvedJavaTypeInfo("java.util.Set<E>", cache, true);
set.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// Map
ResolvedJavaTypeInfo map = createResolvedJavaTypeInfo("java.util.Map<K,V>", cache, true);
registerMethod("keySet() : java.util.Set<K>", map);
registerMethod("values() : java.util.Collection<V>", map);
registerMethod("entrySet() : java.util.Set<java.util.Map$Entry<K,V>>", map);
registerMethod("get(key : K) : V", map);

// Map.Entry
ResolvedJavaTypeInfo mapEntry = createResolvedJavaTypeInfo("java.util.Map$Entry<K,V>", cache, true);
registerMethod("getKey() : K", mapEntry);
registerMethod("getValue() : V", mapEntry);

// AbstractMap
ResolvedJavaTypeInfo abstractMap = createResolvedJavaTypeInfo("java.util.AbstractMap<K,V>", cache, true);
abstractMap.setExtendedTypes(Arrays.asList("java.util.Map<K,V>"));

// HashMap
ResolvedJavaTypeInfo hashMap = createResolvedJavaTypeInfo("java.util.HashMap<K,V>", cache, true);
hashMap.setExtendedTypes(Arrays.asList("java.util.AbstractMap<K,V>", "java.util.Map<K,V>"));

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
createResolvedJavaTypeInfo("java.util.concurrent.CompletionStage<T>", cache, true);
ResolvedJavaTypeInfo completableFuture = createResolvedJavaTypeInfo("java.util.concurrent.CompletableFuture<T>",
cache, true);
completableFuture.setExtendedTypes(Arrays.asList("java.util.concurrent.CompletionStage<T>"));
createResolvedJavaTypeInfo("io.smallrye.mutiny.Uni<T>", cache, true);
ResolvedJavaTypeInfo asyncResultUni = createResolvedJavaTypeInfo("io.smallrye.mutiny.vertx.AsyncResultUni<T>",
cache, true);
asyncResultUni.setExtendedTypes(Arrays.asList("io.smallrye.mutiny.Uni<T>"));

// RawString for raw and safe resolver tests
ResolvedJavaTypeInfo rawString = createResolvedJavaTypeInfo("io.quarkus.qute.RawString", cache, true);
registerMethod("getValue() : java.lang.String", rawString);
registerMethod("toString() : java.lang.String", rawString);
}

private void createSourceTypes(List<ResolvedJavaTypeInfo> cache) {
createResolvedJavaTypeInfo("org.acme", cache, true).setJavaTypeKind(JavaTypeKind.Package);

Expand Down Expand Up @@ -339,7 +252,7 @@ private void createSourceTypes(List<ResolvedJavaTypeInfo> cache) {

// void method
registerMethod("timeoutGame() : void", renardeLogin);

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
ResolvedJavaTypeInfo completionStagePOJO = createResolvedJavaTypeInfo("org.acme.CompletionStagePOJO", cache,
false);
Expand Down Expand Up @@ -529,12 +442,6 @@ protected void fillValueResolvers(List<ValueResolverInfo> resolvers) {

}

@Override
protected void fillJavaTypes(List<JavaTypeInfo> cache) {
createJavaTypeInfo("java.util.List<E>", JavaTypeKind.Interface, cache);
createJavaTypeInfo("java.util.Map<K,V>", JavaTypeKind.Interface, cache);
}

@Override
protected void fillNamespaceResolverInfos(Map<String, NamespaceResolverInfo> infos) {
NamespaceResolverInfo inject = new NamespaceResolverInfo();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"signature": "io.quarkiverse.roq.frontmatter.runtime.model.RoqCollection",
"extendedTypes": [
"java.util.ArrayList<io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage>"
],
"fields": [],
"methods": [
{
"signature": "resolveNextPage(page : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage) : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage"
},
{
"signature": "resolvePreviousPage(page : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage) : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage"
},
{
"signature": "resolvePrevPage(page : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage) : io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage"
},
{
"signature": "paginated(paginator : io.quarkiverse.roq.frontmatter.runtime.model.Paginator) : java.util.List<io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage>"
},
{
"signature": "by(keys : java.lang.String...) : java.util.List<java.lang.Object>"
},
{
"signature": "group(keys : java.lang.String...) : java.util.Map<java.lang.Object,java.util.List<io.quarkiverse.roq.frontmatter.runtime.model.Page>>"
}
],
"binary": true,
"templateDataAnnotations": [
{}
],
"typeKind": 2,
"invalidMethods": {}
}
Loading

0 comments on commit 4bc8ce5

Please sign in to comment.