From f9bed24c00ea0da736d51c0a37187c44a0b5a827 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 3 Aug 2020 06:09:45 -0700 Subject: [PATCH] Fixed 'base' lookup for properties --- IDEHelper/Compiler/BfExprEvaluator.cpp | 19 +++++++------------ IDEHelper/Compiler/BfSystem.cpp | 7 +++++++ IDEHelper/Compiler/BfSystem.h | 1 + IDEHelper/Tests/src/Properties.bf | 15 +++++++++++++++ 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 84673df1..74baaef4 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -7749,10 +7749,8 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig auto target = mModule->GetThis(); target.mType = type; mResult = LookupField(nameNode->mRight, target, fieldName); - if (mPropDef != NULL) - { - mPropDefBypassVirtual = true; - } + if ((mPropDef != NULL) && (mPropDef->IsVirtual())) + mPropDefBypassVirtual = true; return; } } @@ -7906,10 +7904,8 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig if (mPropDef != NULL) { mOrigPropTarget = origResult; - if ((CheckIsBase(nameNode->mLeft)) || (wasBaseLookup)) - { + if (((CheckIsBase(nameNode->mLeft)) || (wasBaseLookup)) && (mPropDef->IsVirtual())) mPropDefBypassVirtual = true; - } } if ((mResult) || (mPropDef != NULL)) return; @@ -7946,10 +7942,8 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* auto target = mModule->GetThis(); target.mType = type; mResult = LookupField(nameRight, target, fieldName); - if (mPropDef != NULL) - { - mPropDefBypassVirtual = true; - } + if ((mPropDef != NULL) && (mPropDef->IsVirtual())) + mPropDefBypassVirtual = true; return; } } @@ -8119,7 +8113,8 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* mOrigPropTarget = origResult; if ((CheckIsBase(nameLeft)) || (wasBaseLookup)) { - mPropDefBypassVirtual = true; + if (mPropDef->IsVirtual()) + mPropDefBypassVirtual = true; } } if ((mResult) || (mPropDef != NULL)) diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index d7a94ebd..14486496 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -381,6 +381,13 @@ BfSizedAtomComposite::~BfSizedAtomComposite() ////////////////////////////////////////////////////////////////////////// +bool BfPropertyDef::IsVirtual() +{ + if (((BfPropertyDeclaration*)mFieldDeclaration)->mVirtualSpecifier) + return true; + return false; +} + bool BfPropertyDef::HasExplicitInterface() { for (auto methodDef : mMethods) diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index dbb3c862..a9fedc0e 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -575,6 +575,7 @@ public: mNextWithSameName = NULL; } + bool IsVirtual(); bool HasExplicitInterface(); BfAstNode* GetRefNode(); }; diff --git a/IDEHelper/Tests/src/Properties.bf b/IDEHelper/Tests/src/Properties.bf index 4d57cf53..6d449143 100644 --- a/IDEHelper/Tests/src/Properties.bf +++ b/IDEHelper/Tests/src/Properties.bf @@ -47,6 +47,8 @@ namespace Tests class ClassB { public StructA B { get; set; } + public int IVal { get => 1; } + public virtual int IVal2 { get => 2; } int mZ = 9; @@ -55,6 +57,12 @@ namespace Tests } } + class ClassC : ClassB + { + public new int IVal { get => base.IVal + 100; } + public override int IVal2 { get => base.IVal2 + 100; } + } + [Test] public static void TestBasics() { @@ -71,6 +79,13 @@ namespace Tests cb.B = .(333); sa = cb.B; Test.Assert(sa.mA == 333); + + ClassC cc = scope .(); + Test.Assert(cc.IVal == 101); + Test.Assert(cc.IVal2 == 102); + ClassB cb2 = cc; + Test.Assert(cb2.IVal == 1); + Test.Assert(cb2.IVal2 == 102); } } }