mplushnikov / lombok-intellij-plugin

Lombok Plugin for IntelliJ IDEA
Apache License 2.0
3.11k stars 635 forks source link

val - Inferred Type is Object #260

Closed andricDu closed 4 years ago

andricDu commented 8 years ago

Here is a code snippet:

  private static String[] toStringArray(Collection<String> source) {
    return source.stream().toArray(String[]::new);
  }

  private static String[] getSearchTypes(String type) {
    val result = TYPE_ID_MAPPINGS.containsKey(type) ? newHashSet(TYPE_ID_MAPPINGS.get(type)) : MULTIPLE_SEARCH_TYPES;

    return toStringArray(result);
  }

TYPE_ID_MAPPINGS is a Map<String, String> explicitly defined as such. MULTIPLE_SEARCH_TYPES is a Set<String> also explicitly defined.

Compiles fine but IntelliJ is complaining that result is a java.lang.object and cannot be passed to toStringArray as it expects a java.util.Collection<java.lang.String>.

This is with IntelliJ 2016.2 and latest plugin version.

alexejk commented 8 years ago

Can you please test it with Lombok Plugin 0.12 ? Thee have been quite a few changes lately in both IDEA and the plugin

andricDu commented 8 years ago

Updated

I've updated to the latest Lombok version (0.12) and tried IntelliJ IDEA 2016.2.1 EAP Build #IU-162.1447.7, built on July 20, 2016 and the issue persists.

Another Example

Here is another example where it complains I'm returning List<Object> rather than List<String>:

    val aggsTransform = transform(aggs.getBuckets(), bucket -> bucket.getKeyAsText().toString());

    return aggsTransform;

You can see the editor appears to be in a disagreement with itself:

An interesting thing is if I cast it like so, it fixes the isssue with a redundant cast warning:

val aggsTransform = (List<String>) transform(...);

However if I cast it at the return, it seems to be complain about Inconvertible Types most of the time. At times if I'm playing around with the method body and than throw the cast on at the return statement, it no longer complains and just mentions the redundant cast. Is it possible there is a race condition in the plugin causing the issue?

Extra Remarks

I've tried with javac as well as the Eclipse compiler + annotation processing options and issues seem to be the same.

Our code base makes heavy use of streams, lambdas, and method references which seems to correlate with where our val issues show up.

Also this project is open source as well in case you were curious at pulling it down and debugging the plugin.

I hope that helps.

Thank you for your response!

alexejk commented 8 years ago

If this issue is the same with Lombok and Eclipse (outside of IntelliJ that is) - this is a problem with Lombok itself. This project is only to provide IntelliJ support for Lombok - not to implement new features in core dependency.

There is a well-known issue with val and Streams/Lambdas in Lombok, for example: https://github.com/rzwitserloot/lombok/issues/911

alexejk commented 8 years ago

As for your sample:

 static Map<String, String> TYPE_ID_MAPPINGS = new HashMap<>();
    static Set<String> MULTIPLE_SEARCH_TYPES = new HashSet<>();

    private static String[] toStringArray(Collection<String> source) {
        return source.stream().toArray(String[]::new);
    }

    private static String[] getSearchTypes(String type) {
        val result = TYPE_ID_MAPPINGS.containsKey(type) ? newHashSet(TYPE_ID_MAPPINGS.get(type)) : MULTIPLE_SEARCH_TYPES;

        return toStringArray(result);
    }

    static  Set<String> newHashSet(String foo) {
        return new HashSet<>();
    }

Seems to not throw an error with 2016.2 , lombok plugin 0.12 and lombok dependency 1.16.10. Can you isolate this into a separate, self-contained project with e.g Gradle or Maven where we can reproduce the issue? Please also include the project configuration (*.iml) files so we can inspect any possible misconfigurations.

andricDu commented 8 years ago

Eclipse does not have this issue. This is IntelliJ + lombok-intellij-plugin issue only.

I only mentioned that it occurs in IntelliJ regardless of which compiler you are using.

That particular issue you mentioned with lombok occurs only inside of lambda bodies and causes an actual compile error. All of our stuff builds fine with javac.

You can find our source code here, and it is a maven project: https://github.com/icgc-dcc/dcc-portal

alexejk commented 8 years ago

Thanks for clarification. I can see if I get some time to check the project - I do wonder, however why the above-mentioned sample actually works fine in IDEa but you are getting warnings. Will keep you posted.

As long as the code compiles via command-line with mvn installin your case - this is correct its IntelliJ-related issue.

alexejk commented 8 years ago

I've just checked your project and it works as intended for me. For example FileService contains quite a few transformations, vals and lambdas but all of them seem to not cause any errors.

Is there a specific file that is causing issues that I can check out? Maybe you should re-import your project after deleting *.iml files? It does look like your project/IDE has some kind of misconfiguration.

andricDu commented 8 years ago

Interesting! Thanks for giving it a go. FileService does provide a single lombok val inference error for me.

If the project looks misconfigured, it is because it was developed in Eclipse with Eclipse project files, and the project itself is a spring-boot project so for the @Autowired annotations to resolve the server module has to have the Spring facet enabled under File -> Project Structure in IntelliJ.

I am just now investigating using IntelliJ for development on this project as we feel the Lombok support is in a good place.

What I am going to do: As a sanity check, I am going to install IntelliJ, Lombok, ...etc.. on a virgin system and see what happens.

Another spot where I am receiving an error is here (subtype variable is resolving to Object): https://github.com/icgc-dcc/dcc-portal/blob/develop/dcc-portal-server/src/main/java/org/icgc/dcc/portal/server/service/EntitySetService.java#L287

Thanks a lot! I appreciate the help, and I'll let you know what I find on a fresh system.

andricDu commented 8 years ago

One last note, the develop branch has a few spots where classes are using the experimental @UtilityClass Lombok annotation. I'm doing my testing on a branch where those have been stripped out as we made a decision to not use that annotation as it can cause issues.

alexejk commented 8 years ago

Latest lombok plugin supports @UtilityClass on 2016.2 version of IDEA. If you are on older version (all the way down to 15.x) you can enable "IntelliJ runtime patching" in Lombok plugin configuration. This is however not needed for 2016.2 as it provides native APIs for modifier visibility augmentation.

Please double check if all parts of newly imported code have Annotation Processing enabled.

andricDu commented 8 years ago

I've reproduced the issue, and in the same file you tried (FileService.java, line 292 in my case).

Fresh System

Original System

Going to attempt a couple more sanity checks on my main dev machine (Mac).

andricDu commented 8 years ago

Also this may sound silly but I'm observing some non determinism in the val errors showing up, both between the two machines, and against the machine itself between IDE opens.

andricDu commented 8 years ago

So this is the weirdism I'm seeing (fresh system, latest everything):

Initially the IDE shows:

Then all I do is add a single white space before the return and hit save to trigger the inspection again:

Suddenly it works?

slovit commented 8 years ago

Same issue for me. Just imported the project and did nothing more. IDE: 2016.2 Ultimate Lombok plugin: 0.13.16

screen shot 2016-07-28 at 9 51 56 am

andricDu commented 8 years ago

Not sure if related to this, but I noticed that IntelliJ was reporting exceptions caused by lombok plugin:

Accessing 'java.class.fqn' during processing 'java.field.name'. Nested different indices processing may cause deadlock
java.lang.Throwable
    at com.intellij.openapi.diagnostic.Logger.error(Logger.java:127)
    at com.intellij.util.indexing.IndexAccessValidator.checkAccessingIndexDuringOtherIndexProcessing(IndexAccessValidator.java:37)
    at com.intellij.psi.stubs.StubIndexImpl.a(StubIndexImpl.java:340)
    at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:316)
    at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:146)
    at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:135)
    at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:48)
    at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.a(JavaFileManagerImpl.java:91)
    at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:126)
    at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:54)
    at com.intellij.psi.impl.JavaPsiFacadeImpl.b(JavaPsiFacadeImpl.java:122)
    at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:99)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.a(PsiJavaCodeReferenceElementImpl.java:395)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.access$100(PsiJavaCodeReferenceElementImpl.java:55)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl$OurGenericsResolver.resolve(PsiJavaCodeReferenceElementImpl.java:350)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl$OurGenericsResolver.resolve(PsiJavaCodeReferenceElementImpl.java:342)
    at com.intellij.psi.impl.source.resolve.ResolveCache$4.compute(ResolveCache.java:191)
    at com.intellij.psi.impl.source.resolve.ResolveCache$4.compute(ResolveCache.java:188)
    at com.intellij.openapi.util.RecursionManager$2.doPreventingRecursion(RecursionManager.java:112)
    at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:188)
    at com.intellij.psi.impl.PsiImplUtil.multiResolveImpl(PsiImplUtil.java:745)
    at com.intellij.psi.impl.PsiImplUtil.multiResolveImpl(PsiImplUtil.java:734)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.multiResolve(PsiJavaCodeReferenceElementImpl.java:377)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.advancedResolve(PsiJavaCodeReferenceElementImpl.java:370)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.resolve(PsiJavaCodeReferenceElementImpl.java:339)
    at com.intellij.psi.impl.source.PsiImportStatementBaseImpl.resolve(PsiImportStatementBaseImpl.java:64)
    at com.intellij.psi.impl.source.PsiJavaFileBaseImpl.a(PsiJavaFileBaseImpl.java:329)
    at com.intellij.psi.impl.source.PsiJavaFileBaseImpl.processDeclarations(PsiJavaFileBaseImpl.java:303)
    at com.intellij.psi.scope.util.PsiScopesUtil.treeWalkUp(PsiScopesUtil.java:68)
    at com.intellij.psi.scope.util.PsiScopesUtil.treeWalkUp(PsiScopesUtil.java:50)
    at com.intellij.psi.scope.util.PsiScopesUtil.resolveAndWalk(PsiScopesUtil.java:226)
    at com.intellij.psi.scope.util.PsiScopesUtil.resolveAndWalk(PsiScopesUtil.java:157)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.a(PsiJavaCodeReferenceElementImpl.java:448)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.access$100(PsiJavaCodeReferenceElementImpl.java:55)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl$OurGenericsResolver.resolve(PsiJavaCodeReferenceElementImpl.java:350)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl$OurGenericsResolver.resolve(PsiJavaCodeReferenceElementImpl.java:342)
    at com.intellij.psi.impl.source.resolve.ResolveCache$4.compute(ResolveCache.java:191)
    at com.intellij.psi.impl.source.resolve.ResolveCache$4.compute(ResolveCache.java:188)
    at com.intellij.openapi.util.RecursionManager$2.doPreventingRecursion(RecursionManager.java:112)
    at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:188)
    at com.intellij.psi.impl.PsiImplUtil.multiResolveImpl(PsiImplUtil.java:745)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.a(PsiJavaCodeReferenceElementImpl.java:277)
    at com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl.getCanonicalText(PsiJavaCodeReferenceElementImpl.java:262)
    at com.intellij.psi.impl.source.tree.java.PsiAnnotationImpl.getQualifiedName(PsiAnnotationImpl.java:96)
    at de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil.findAnnotationQuick(PsiAnnotationSearchUtil.java:58)
    at de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil.findAnnotation(PsiAnnotationSearchUtil.java:33)
    at de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil.isAnnotatedWith(PsiAnnotationSearchUtil.java:82)
    at de.plushnikov.intellij.plugin.processor.modifier.ValueModifierProcessor.isSupported(ValueModifierProcessor.java:34)
    at de.plushnikov.intellij.plugin.provider.LombokAugmentProvider.transformModifiers(LombokAugmentProvider.java:81)
    at com.intellij.psi.augment.PsiAugmentProvider$3.process(PsiAugmentProvider.java:133)
    at com.intellij.psi.augment.PsiAugmentProvider$3.process(PsiAugmentProvider.java:130)
    at com.intellij.psi.augment.PsiAugmentProvider.forEach(PsiAugmentProvider.java:146)
    at com.intellij.psi.augment.PsiAugmentProvider.transformModifierProperties(PsiAugmentProvider.java:130)
    at com.intellij.psi.impl.source.PsiModifierListImpl.b(PsiModifierListImpl.java:96)
    at com.intellij.psi.impl.source.PsiModifierListImpl.hasModifierProperty(PsiModifierListImpl.java:84)
    at com.intellij.psi.impl.source.PsiFieldImpl.hasModifierProperty(PsiFieldImpl.java:182)
    at com.intellij.codeInsight.completion.JavaCompletionUtil.isInExcludedPackage(JavaCompletionUtil.java:136)
    at com.intellij.codeInsight.daemon.impl.quickfix.StaticMembersProcessor.process(StaticMembersProcessor.java:132)
    at com.intellij.codeInsight.daemon.impl.quickfix.StaticMembersProcessor.process(StaticMembersProcessor.java:32)
    at com.intellij.psi.stubs.StubProcessingHelperBase.processStubsInFile(StubProcessingHelperBase.java:169)
    at com.intellij.psi.stubs.StubProcessingHelperBase.processStubsInFile(StubProcessingHelperBase.java:52)
    at com.intellij.psi.stubs.StubIndexImpl$2.process(StubIndexImpl.java:324)
    at com.intellij.psi.stubs.StubIndexImpl$StubIdListContainerAction.perform(StubIndexImpl.java:675)
    at com.intellij.psi.stubs.StubIndexImpl$StubIdListContainerAction.perform(StubIndexImpl.java:663)
    at com.intellij.util.indexing.ValueContainer.forEach(ValueContainer.java:81)
    at com.intellij.psi.stubs.StubIndexImpl.a(StubIndexImpl.java:350)
    at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:316)
    at com.intellij.psi.impl.PsiShortNamesCacheImpl.processFieldsWithName(PsiShortNamesCacheImpl.java:236)
    at com.intellij.psi.impl.CompositeShortNamesCache.processFieldsWithName(CompositeShortNamesCache.java:273)
    at com.intellij.codeInsight.daemon.impl.quickfix.StaticImportConstantFix.getMembersToImport(StaticImportConstantFix.java:73)
    at com.intellij.codeInsight.daemon.impl.quickfix.StaticImportMemberFix.isAvailable(StaticImportMemberFix.java:78)
    at com.intellij.codeInsight.daemon.impl.ShowAutoImportPass.a(ShowAutoImportPass.java:146)
    at com.intellij.codeInsight.daemon.impl.ShowAutoImportPass.addImports(ShowAutoImportPass.java:94)
    at com.intellij.codeInsight.daemon.impl.DefaultHighlightInfoProcessor.a(DefaultHighlightInfoProcessor.java:70)
    at com.intellij.openapi.application.TransactionGuardImpl.a(TransactionGuardImpl.java:88)
    at com.intellij.openapi.application.TransactionGuardImpl.access$300(TransactionGuardImpl.java:40)
    at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:113)
    at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.a(LaterInvocator.java:326)
    at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:310)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at com.intellij.ide.IdeEventQueue.i(IdeEventQueue.java:793)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:629)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:385)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
mplushnikov commented 4 years ago

Closed this issue as obsolete now after last changes in IntelliJ 2020.3.EAP Feel free to open new one.