`MemberResolver` misses members inherited via self-referential interface (`ResolvedRecursiveType` as implemented interface)
Um pull request relacionado já foi integrado.
- #135 de @cowtowncoder — integrado
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Start with MemberResolver and how it walks implemented interfaces, then look at ResolvedRecursiveType.getImplementedInterfaces(), which returns an empty list. Compare with the super-class handling in ResolvedObjectType.getParentClass() that #128 added. Done when the self-referential outerInMid from the reproduction yields the same member methods (get(), top()) as stand-alone OuterI.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
When an implemented interface of a type is a self-reference (ResolvedRecursiveType), it is returned as-is by getImplementedInterfaces(); and since ResolvedRecursiveType.getImplementedInterfaces() returns an empty list (to avoid infinite loops), MemberResolver silently drops all members inherited through that interface.
Reproduction
public interface Top { void top(); }
public interface BaseI<X> extends Top { X get(); }
public interface MidI<T> extends BaseI<OuterI> { }
public interface OuterI extends MidI<String> { }
TypeResolver r = new TypeResolver();
MemberResolver mr = new MemberResolver(r);
// `OuterI` as type parameter of `BaseI<OuterI>`, within `MidI<String>`:
ResolvedType outerInMid = r.resolve(MidI.class, String.class)
.getImplementedInterfaces().get(0).getTypeParameters().get(0);
mr.resolve(outerInMid, null, null).getMemberMethods().length; // 0
mr.resolve(r.resolve(OuterI.class), null, null).getMemberMethods().length; // 2 (`get()`, `top()`)
Here outerInMid implements MidI<String> via a self-reference (since MidI<String> was still being resolved), so BaseI and Top (and their methods) are not reachable.
(note: on 1.7 / current main, even stand-alone OuterI resolves to 0 member methods)
Expected
Same members as for stand-alone OuterI.
Notes
#128 handled the equivalent case for super classes: ResolvedObjectType.getParentClass() maps a self-referential super class to the type it represents (ResolvedRecursiveType.getActualType(), new in 1.8). Super interfaces would need similar handling: either in getImplementedInterfaces() of ResolvedObjectType / ResolvedInterfaceType, or in MemberResolver (HierarchicType construction) when traversing interfaces. Changing what getImplementedInterfaces() returns would be a (minor) behavioral change, so MemberResolver-side handling may be preferable.
- Linguagem predominante
- Java
- Estrelas
- 266
- Forks
- 53
- Merge médio
- 18h 46min
- PRs com merge (30d)
- 8
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de FasterXML/java-classmate
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
FasterXML/java-classmate#111 · 10 comentários ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 20/100
FasterXML/java-classmate#81 · 1 comentário ·
-
Make `GenericType<T>` not implement `java.lang.reflect.Type`Talvez já em andamento @cowtowncoder assumiu há 315 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
FasterXML/java-classmate#76 · 6 comentários · 1 reação ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 20/100
FasterXML/java-classmate#72 · 3 comentários ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
FasterXML/java-classmate#69 · 22 comentários ·
Todas as issues de FasterXML/java-classmate
Issues semelhantes
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
apache/rocketmq-dashboard#6896 ·
Mantenedores costumam responder em até 3 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 67/100
-
Unrecognized database schema version is treated as a pre-2.0 databaseTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Abertabug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
OpenIntegrationEngine/engine#496 ·
Mantenedores costumam responder em até 1 dia
-
enhancement good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
SasanLabs/VulnerableApp#836 ·
Mantenedores costumam responder em até 1 dia