From adb375c02bf8388af0857eb1d9b8fa86298b5d6c Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 15 Jan 2018 19:55:04 +0300 Subject: [PATCH] [groovy] add and use compilation phase hint for fields --- .../groovy/lang/psi/util/GrClassImplUtil.java | 9 +++++-- .../lang/psi/util/groovyClassImplUtil.kt | 26 +++++++++++++++++++ .../lang/resolve/CompilationPhaseHint.java | 17 ++++++++++++ .../groovy/lang/resolve/ResolveUtil.kt | 6 ++--- 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/groovyClassImplUtil.kt create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CompilationPhaseHint.java diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java index 25924f1ea6a2..f28f75ed9e7e 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java @@ -1,5 +1,4 @@ -// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.util; import com.intellij.openapi.diagnostic.Logger; @@ -37,10 +36,12 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUt import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.GrTypeDefinitionImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrScriptField; import org.jetbrains.plugins.groovy.lang.resolve.CollectClassMembersUtil; +import org.jetbrains.plugins.groovy.lang.resolve.CompilationPhaseHint; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import java.util.*; +import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyClassImplUtilKt.processPhase; import static org.jetbrains.plugins.groovy.lang.resolve.ResolveUtilKt.isAnnotationResolve; import static org.jetbrains.plugins.groovy.lang.resolve.ResolveUtilKt.shouldProcessTypeParameters; @@ -199,6 +200,10 @@ public class GrClassImplUtil { @NotNull PsiElement place) { if (isAnnotationResolve(processor)) return true; //don't process class members while resolving annotation + if (processor.getHint(CompilationPhaseHint.HINT_KEY) != null) { + return processPhase(grType, processor, state); + } + if (shouldProcessTypeParameters(processor)) { for (final PsiTypeParameter typeParameter : grType.getTypeParameters()) { if (!ResolveUtil.processElement(processor, typeParameter, state)) return false; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/groovyClassImplUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/groovyClassImplUtil.kt new file mode 100644 index 000000000000..6953004b26b2 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/groovyClassImplUtil.kt @@ -0,0 +1,26 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.lang.psi.util + +import com.intellij.psi.ResolveState +import com.intellij.psi.scope.PsiScopeProcessor +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition +import org.jetbrains.plugins.groovy.lang.resolve.CompilationPhaseHint +import org.jetbrains.plugins.groovy.lang.resolve.CompilationPhaseHint.Phase.CONVERSION +import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil.processElement +import org.jetbrains.plugins.groovy.lang.resolve.shouldProcessFields + +fun GrTypeDefinition.processPhase(processor: PsiScopeProcessor, state: ResolveState): Boolean { + val hint = requireNotNull(processor.getHint(CompilationPhaseHint.HINT_KEY)) + return when (hint.beforePhase()) { + CONVERSION -> processBeforeConversion(processor, state) + } +} + +private fun GrTypeDefinition.processBeforeConversion(processor: PsiScopeProcessor, state: ResolveState): Boolean { + if (processor.shouldProcessFields()) { + for (codeField in codeFields) { // raw field nodes as appear after parsing + if (!processElement(processor, codeField, state)) return false + } + } + return true +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CompilationPhaseHint.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CompilationPhaseHint.java new file mode 100644 index 000000000000..3735dd4d0b0b --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CompilationPhaseHint.java @@ -0,0 +1,17 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.lang.resolve; + +import com.intellij.openapi.util.Key; +import org.jetbrains.annotations.NotNull; + +public interface CompilationPhaseHint { + + Key HINT_KEY = Key.create("groovy.compilation.phase"); + + enum Phase { + CONVERSION + } + + @NotNull + Phase beforePhase(); +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.kt index a8fd906aae41..be6cb66fd4a6 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.kt @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. @file:Suppress("LoopToCallChain") package org.jetbrains.plugins.groovy.lang.resolve @@ -68,6 +66,8 @@ fun PsiScopeProcessor.shouldProcessDynamicProperties(): Boolean { fun PsiScopeProcessor.shouldProcessLocals(): Boolean = shouldProcess(GroovyResolveKind.VARIABLE) +fun PsiScopeProcessor.shouldProcessFields(): Boolean = shouldProcess(GroovyResolveKind.FIELD) + fun PsiScopeProcessor.shouldProcessMethods(): Boolean { return ResolveUtil.shouldProcessMethods(getHint(ElementClassHint.KEY)) }