|
Re: Error on first generation regarding superType [message #1792767 is a reply to message #1792763] |
Mon, 23 July 2018 16:13 |
|
hi
please please provide minimal samples if you ask for help.
your inferrer pattern looks wired.
the default pattern is
acceptor.accecpt(element.toClass()) [
// late init
]
you can reference the outer class like this
val outer = it
if (!element.valueClasses.isEmpty) {
for (vClass : element.valueClasses) {
val className = vClass.name.toCamelCase
members += element.toClass(className) [
static = true
//TODO
superTypes += outer.typeRef
or you dont use that wired wired pattern for names
acceptor.accept(
element.toClass(element.packageName + "." +element.name)) [
....
superTypes += (element.packageName + "." +element.name) .typeRef
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Re: Error on first generation regarding superType [message #1792800 is a reply to message #1792767] |
Tue, 24 July 2018 09:23 |
Karsten Wilken Messages: 59 Registered: August 2016 |
Member |
|
|
I included the projects rather than parts of the code since I had no clue which part could case this behaviour.
After I changed the inferrer back to the default pattern and used the "outer" reference the "extends" is created correctly.
I use the weird name pattern "(element.packageName + "." +element.name) .typeRef" only within the acceptor for the visitor class for the parameter within the "toMethod".
If I simply use the name of the "valueClass" alone the reference doesn't get resolved.
acceptor.accept(element.toClass(visitor)) [
packageName = element.packageName
interface = true
for (vClass : element.valueClasses) {
val vName = vClass.name.toCamelCase
members += element.toMethod("visit" + vName, typeRef("void")) [
abstract = true
parameters += toParameter(
vClass,
"value",
vName.typeRef
)
]
}
]
This leads to the generated code:
public abstract void visitSubClassOne(final SubClassOne value);
With the error that SubClassOne couldn't be resolved. (most likely because it is a subclass of the "parent" class)
If I use the weird name pattern:
acceptor.accept(element.toClass(visitor)) [
packageName = element.packageName
interface = true
for (vClass : element.valueClasses) {
val vName = vClass.name.toCamelCase
members += element.toMethod("visit" + vName, typeRef("void")) [
abstract = true
parameters += toParameter(
vClass,
"value",
(element.fullyQualifiedName.toString + "." + vName).typeRef
)
]
}
]
This method gets generated:
public abstract void visitSubClassOne(final ParentClass.SubClassOne value);
Not ideal but since it is in the same package at least it worked.
The implicit question is: What would be the correct way to reference a subclass?
[Updated on: Tue, 24 July 2018 09:25] Report message to a moderator
|
|
|
|
|
|
|
Re: Error on first generation regarding superType [message #1793973 is a reply to message #1793971] |
Tue, 21 August 2018 12:07 |
|
def dispatch void infer(Model element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
acceptor.accept(element.toClass("dummy.Outer")) [
members+=element.toClass("Inner1") [
static = true
]
members+=element.toClass("Inner2") [
static = true
]
]
acceptor.accept(element.toClass("dummy.Outer2")) [
superTypes+="dummy.Outer$Inner1".typeRef
]
}
works fine for me
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Re: Error on first generation regarding superType [message #1793974 is a reply to message #1793971] |
Tue, 21 August 2018 12:26 |
Karsten Wilken Messages: 59 Registered: August 2016 |
Member |
|
|
Well. Nevermind. The one thing I didn't try was taking your "suggestion"/answer literally!
"path.to.Outer$Inner " was the solution.
Instead of "(element.packageName + "." + element.name + "." + vClass.name).typeRef" I tried this during building the example
"(element.packageName + "." + element.name + "$" + vClass.name).typeRef" and it works.
Edit: And again, you are faster as usual ;)
[Updated on: Tue, 21 August 2018 12:48] Report message to a moderator
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04483 seconds