Skip to content

Commit

Permalink
Right fix for resolving overloaded class parameters: #SCL-4357
Browse files Browse the repository at this point in the history
#SCL-5153 Fixed
#SCL-5023 Fixed
  • Loading branch information
Alefas committed Jan 21, 2013
1 parent 7bc7771 commit 7a87421
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 19 deletions.
Expand Up @@ -19,7 +19,7 @@ import com.intellij.psi._
import api.ScalaElementVisitor
import lang.resolve.processor.BaseProcessor
import caches.CachesUtil
import util.PsiModificationTracker
import util.{PsiTreeUtil, PsiModificationTracker}
import com.intellij.openapi.project.DumbServiceImpl
import types.ScType
import api.toplevel.{ScTypedDefinition, ScTypeParametersOwner}
Expand Down
Expand Up @@ -607,8 +607,8 @@ object TypeDefinitionMembers {
isObject = clazz.isInstanceOf[ScObject], signaturesForJava = signaturesForJava,
syntheticMethods = syntheticMethods)) return false

if (!(AnyRef.asClass(clazz.getProject).getOrElse(return true).processDeclarations(processor, state, lastParent, place) &&
Any.asClass(clazz.getProject).getOrElse(return true).processDeclarations(processor, state, lastParent, place))) return false
if (!(types.AnyRef.asClass(clazz.getProject).getOrElse(return true).processDeclarations(processor, state, lastParent, place) &&
types.Any.asClass(clazz.getProject).getOrElse(return true).processDeclarations(processor, state, lastParent, place))) return false

//fake enum methods
val isJavaSourceEnum = !clazz.isInstanceOf[ClsClassImpl] && clazz.isEnum
Expand All @@ -635,9 +635,9 @@ object TypeDefinitionMembers {
if (!privateProcessDeclarations(processor, state, lastParent, place, getSignatures(td),
getParameterlessSignatures(td), getTypes(td), isSupers = true, isObject = td.isInstanceOf[ScObject])) return false

if (!(AnyRef.asClass(td.getProject).getOrElse(return true).
if (!(types.AnyRef.asClass(td.getProject).getOrElse(return true).
processDeclarations(processor, state, lastParent, place) &&
Any.asClass(td.getProject).getOrElse(return true).
types.Any.asClass(td.getProject).getOrElse(return true).
processDeclarations(processor, state, lastParent, place))) return false
true
}
Expand All @@ -656,8 +656,8 @@ object TypeDefinitionMembers {
if (lastParent != null) lastParent.getProject
else if (place != null) place.getProject
else return true
if (!(AnyRef.asClass(project).getOrElse(return true).processDeclarations(processor, state, lastParent, place) &&
Any.asClass(project).getOrElse(return true).processDeclarations(processor, state, lastParent, place)))
if (!(types.AnyRef.asClass(project).getOrElse(return true).processDeclarations(processor, state, lastParent, place) &&
types.Any.asClass(project).getOrElse(return true).processDeclarations(processor, state, lastParent, place)))
return false

true
Expand Down
Expand Up @@ -159,13 +159,7 @@ class ScalaResolveResult(val element: PsiNamedElement,
case "scala.Predef" => return SCALA
case "scala.LowPriorityImplicits" => return SCALA
case "scala" => return SCALA
case _ =>
memb match {
case param: ScClassParameter if param.isEffectiveVal &&
!PsiTreeUtil.isContextAncestor(clazz, place, true) && !isNamedParameter =>
return VAL_VAR_CLASS_PARAMETER
case _ => return OTHER_MEMBERS
}
case _ => OTHER_MEMBERS
}
}
}
Expand Down
Expand Up @@ -5,15 +5,15 @@ package processor

import psi.api.statements._
import com.intellij.psi._
import params.ScTypeParam
import params.{ScClassParameter, ScTypeParam}
import psi.types._
import nonvalue.TypeParameter
import psi.api.base.types.ScTypeElement
import result.TypingContext
import collection.immutable.HashSet
import scala.collection.Set
import psi.implicits.ScImplicitlyConvertible
import psi.api.toplevel.typedef.{ScClass, ScObject}
import psi.api.toplevel.typedef.{ScTemplateDefinition, ScMember, ScClass, ScObject}
import psi.impl.toplevel.synthetic.ScSyntheticFunction
import psi.impl.ScPackageImpl
import caches.CachesUtil
Expand All @@ -23,6 +23,7 @@ import psi.api.base.{ScMethodLike, ScPrimaryConstructor}
import psi.api.toplevel.{ScTypeParametersOwner, ScTypedDefinition}
import extensions._
import psi.types.Compatibility.{ConformanceExtResult, Expression}
import psi.api.base.patterns.ScBindingPattern

//todo: remove all argumentClauses, we need just one of them
class MethodResolveProcessor(override val ref: PsiElement,
Expand Down Expand Up @@ -374,9 +375,48 @@ object MethodResolveProcessor {
}
}

def candidates(proc: MethodResolveProcessor, input: Set[ScalaResolveResult]): Set[ScalaResolveResult] = {
def candidates(proc: MethodResolveProcessor, _input: Set[ScalaResolveResult]): Set[ScalaResolveResult] = {
import proc._

//We want to leave only fields and properties from inherited classes, this is important, because
//field in base class is shadowed by private field from inherited class
val input: Set[ScalaResolveResult] = _input.filter {
case r: ScalaResolveResult =>
r.element match {
case f: ScFunction if f.hasParameterClause => true
case b: ScTypedDefinition =>
b.nameContext match {
case m: ScMember =>
val clazz1: ScTemplateDefinition = m.containingClass
if (clazz1 == null) true
else {
_input.forall {
case r2: ScalaResolveResult =>
r2.element match {
case f: ScFunction if f.hasParameterClause => true
case b2: ScTypedDefinition =>
b2.nameContext match {
case m2: ScMember =>
val clazz2: ScTemplateDefinition = m2.containingClass
if (clazz2 == null) true
else {
if (clazz1 == clazz2) true
else {
ScalaPsiUtil.cachedDeepIsInheritor(clazz1, clazz2)
}
}
case _ => true
}
case _ => true
}
}
}
case _ => true
}
case _ => true
}
}

def expand(r: ScalaResolveResult): Set[ScalaResolveResult] = {
def applyMethodsFor(tp: ScType) = {
val processor = new CollectMethodsProcessor(ref, "apply")
Expand Down
Expand Up @@ -91,7 +91,6 @@ object PrecedenceHelper {
val PACKAGE_LOCAL = 6
val WILDCARD_IMPORT = 7
val IMPORT = 8
val VAL_VAR_CLASS_PARAMETER = 9
val OTHER_MEMBERS = 10
val OTHER_MEMBERS = 9
}
}
Expand Up @@ -317,6 +317,8 @@ class TypeInferenceBugs5Test extends TypeInferenceTestBase {

def testSCL4938() {doTest()}

def testSCL5023() {doTest()}

def testSCL5048() {doTest()}

def testSCL5055() {doTest()}
Expand Down
9 changes: 9 additions & 0 deletions testdata/typeInference/bugs5/SCL5023.scala
@@ -0,0 +1,9 @@
class test {

case class C(a: Int) {
def a(i: Int): Int = 1
}

def f(c: C) = /*start*/c.a/*end*/ //missing arguments for method a(Int)
}
//Int

0 comments on commit 7a87421

Please sign in to comment.