Index: src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs =================================================================== --- src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs (revision 2042) +++ src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs (working copy) @@ -2373,13 +2373,13 @@ IEntity member = ResolveMember(node); if (null == member) return; - EnsureRelatedNodeWasVisited(node, member); - if (EntityType.Ambiguous == member.EntityType) { member = ResolveAmbiguousReference(node, (Ambiguous)member); } + EnsureRelatedNodeWasVisited(node, member); + IMember memberInfo = member as IMember; if (null != memberInfo) { @@ -2463,14 +2463,32 @@ private IEntity ResolveAmbiguousReference(ReferenceExpression node, Ambiguous candidates) { if (!AstUtil.IsTargetOfSlicing(node) - && !AstUtil.IsLhsOfAssignment(node) - && candidates.AllEntitiesAre(EntityType.Property)) + && !AstUtil.IsLhsOfAssignment(node)) { - return ResolveAmbiguousPropertyReference(node, candidates, EmptyExpressionCollection); + if (candidates.AllEntitiesAre(EntityType.Property)) + { + return ResolveAmbiguousPropertyReference(node, candidates, EmptyExpressionCollection); + } + else if (candidates.AllEntitiesAre(EntityType.Method)) + { + return ResolveAmbiguousMethodReference(node, candidates, EmptyExpressionCollection); + } } return candidates; } - + + private IEntity ResolveAmbiguousMethodReference(ReferenceExpression node, Ambiguous candidates, ExpressionCollection args) + { + //BOO-656 + if (!AstUtil.IsTargetOfMethodInvocation(node) + && !AstUtil.IsTargetOfSlicing(node) + && !AstUtil.IsLhsOfAssignment(node)) + { + return candidates.Entities[0]; + } + return candidates; + } + private IEntity ResolveAmbiguousPropertyReference(ReferenceExpression node, Ambiguous candidates, ExpressionCollection args) { IEntity[] entities = candidates.Entities; Index: src/Boo.Lang.Compiler/TypeSystem/CallableSignature.cs =================================================================== --- src/Boo.Lang.Compiler/TypeSystem/CallableSignature.cs (revision 2042) +++ src/Boo.Lang.Compiler/TypeSystem/CallableSignature.cs (working copy) @@ -111,7 +111,7 @@ { return false; } - return Equals(_parameters, rhs._parameters); + return AreSameParameters(_parameters, rhs._parameters); } override public string ToString() @@ -129,7 +129,7 @@ return buffer.ToString(); } - bool Equals(IParameter[] lhs, IParameter[] rhs) + static public bool AreSameParameters(IParameter[] lhs, IParameter[] rhs) { if (lhs.Length != rhs.Length) { Index: tests/testcases/errors/BCE0004-1.boo =================================================================== --- tests/testcases/errors/BCE0004-1.boo (revision 2042) +++ tests/testcases/errors/BCE0004-1.boo (working copy) @@ -1,10 +0,0 @@ -""" -BCE0004-1.boo(10,18): BCE0004: Ambiguous reference 'Foo': Ambiguous.Foo(System.Int32), Ambiguous.Foo(). -""" -class Ambiguous: - def Foo(a as int): - pass - def Foo(): - pass - -fn = Ambiguous().Foo Index: tests/testcases/regression/BOO-656-1.boo =================================================================== --- tests/testcases/regression/BOO-656-1.boo (revision 0) +++ tests/testcases/regression/BOO-656-1.boo (revision 0) @@ -0,0 +1,55 @@ +""" +StatemachineBase.constructor +StatemachineBase._S_OFF_ +StatemachineBase._S_AUTO_ +--- +StatemachineBase.constructor +StatemachineDerived._S_OFF_ +StatemachineDerived._S_AUTO_ +StatemachineDerived.constructor +StatemachineDerived._S_AUTO_ +StatemachineDerived._S_OFF_ +""" +class StatemachineBase: + + state as callable = self._S_OFF_ + + def constructor(): + print "StatemachineBase.constructor" + state() + state() + + virtual def _S_OFF_(): + print "StatemachineBase._S_OFF_" + self.state = self._S_AUTO_ + + virtual def _S_AUTO_(): + print "StatemachineBase._S_AUTO_" + self.state = _S_OFF_ + +class StatemachineSubclass(StatemachineBase): + pass + +class StatemachineDerived(StatemachineSubclass): + def constructor(): + super() + print "StatemachineDerived.constructor" + self.state = self._S_AUTO_ //prev. gave ambiguous error + state() + state() + + def _S_OFF_(): + print "StatemachineDerived._S_OFF_" + //super._S_OFF_() + self.state = self._S_AUTO_ //prev. gave ambiguous error + + def _S_AUTO_(): + print "StatemachineDerived._S_AUTO_" + //super._S_AUTO_() + self.state = _S_OFF_ //prev. gave ambiguous error + +b = StatemachineBase() +print "---" +b = StatemachineDerived() + +