@@ -4896,9 +4896,10 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI
48964896 }
48974897
48984898 BfTypedValue result;
4899+ BfFieldDef* fieldDef = NULL;
48994900 if (thisValue.HasType())
49004901 {
4901- result = LookupField(identifierNode, thisValue, findName, BfLookupFieldFlag_IsImplicitThis);
4902+ result = LookupField(identifierNode, thisValue, findName, BfLookupFieldFlag_IsImplicitThis, &fieldDef );
49024903 if (mResultFieldInstance == NULL)
49034904 {
49044905 mResultLocalVar = NULL;
@@ -4933,10 +4934,10 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI
49334934 if (globalContainer.mTypeInst == NULL)
49344935 continue;
49354936 thisValue = BfTypedValue(globalContainer.mTypeInst);
4936- result = LookupField(identifierNode, thisValue, findName);
4937+ result = LookupField(identifierNode, thisValue, findName, BfLookupFieldFlag_None, &fieldDef );
49374938 if ((result) || (mPropDef != NULL))
49384939 {
4939- mModule->SetHighestElementType(identifierNode, BfSourceElementType_Member);
4940+ mModule->SetHighestElementType(identifierNode, fieldDef != NULL && fieldDef->IsNonConstStatic() ? BfSourceElementType_Static : BfSourceElementType_Member);
49404941 return result;
49414942 }
49424943 }
@@ -4948,18 +4949,18 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI
49484949 for (auto typeInst : staticSearch->mStaticTypes)
49494950 {
49504951 thisValue = BfTypedValue(typeInst);
4951- result = LookupField(identifierNode, thisValue, findName);
4952+ result = LookupField(identifierNode, thisValue, findName, BfLookupFieldFlag_None, &fieldDef );
49524953 if ((result) || (mPropDef != NULL))
49534954 {
4954- mModule->SetHighestElementType(identifierNode, BfSourceElementType_Member);
4955+ mModule->SetHighestElementType(identifierNode, fieldDef != NULL && fieldDef->IsNonConstStatic() ? BfSourceElementType_Static : BfSourceElementType_Member);
49554956 return result;
49564957 }
49574958 }
49584959 }
49594960 }
49604961 else
49614962 {
4962- mModule->SetHighestElementType(identifierNode, BfSourceElementType_Member);
4963+ mModule->SetHighestElementType(identifierNode, fieldDef != NULL && fieldDef->IsNonConstStatic() ? BfSourceElementType_Static : BfSourceElementType_Member);
49634964 }
49644965
49654966 if ((!result) && (identifierNode != NULL))
@@ -5781,7 +5782,7 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
57815782 return retVal;
57825783}
57835784
5784- BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags)
5785+ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags, BfFieldDef** fieldDef )
57855786{
57865787 if (target)
57875788 flags = (BfLookupFieldFlags)(flags | BfLookupFieldFlag_HasInstance);
@@ -5795,7 +5796,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
57955796 {
57965797 for (auto iface : genericParamInst->mInterfaceConstraints)
57975798 {
5798- auto result = LookupField(targetSrc, BfTypedValue(target.mValue, iface), fieldName, flags);
5799+ auto result = LookupField(targetSrc, BfTypedValue(target.mValue, iface), fieldName, flags, fieldDef );
57995800 if ((result) || (mPropDef != NULL))
58005801 {
58015802 return result;
@@ -6065,7 +6066,14 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
60656066 }
60666067
60676068 if (matchedField != NULL)
6069+ {
6070+ if (fieldDef != NULL)
6071+ {
6072+ *fieldDef = matchedField;
6073+ }
6074+
60686075 return LoadField(targetSrc, target, curCheckType, matchedField, flags);
6076+ }
60696077
60706078 BfPropertyDef* nextProp = NULL;
60716079 if (curCheckType->mTypeDef->mPropertySet.TryGetWith(fieldName, &entry))
@@ -6152,7 +6160,14 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
61526160 }
61536161
61546162 if (matchedProp != NULL)
6163+ {
6164+ if (fieldDef != NULL)
6165+ {
6166+ *fieldDef = matchedProp;
6167+ }
6168+
61556169 return LoadProperty(targetSrc, target, curCheckType, matchedProp, flags, checkedKind, isInlined);
6170+ }
61566171 }
61576172
61586173 if (curCheckType->mTypeDef->mHasUsingFields)
@@ -6314,7 +6329,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
63146329 newFlags = (BfLookupFieldFlags)(newFlags | BfLookupFieldFlag_HasInstance);
63156330
63166331 // Check statics in outer type
6317- return LookupField(targetSrc, BfTypedValue(outerTypeDef), fieldName, newFlags);
6332+ return LookupField(targetSrc, BfTypedValue(outerTypeDef), fieldName, newFlags, fieldDef );
63186333 }
63196334
63206335 return BfTypedValue();
@@ -11361,6 +11376,23 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig
1136111376
1136211377 if (!mResult)
1136311378 {
11379+ auto type = mModule->ResolveTypeRef(nameLeft, NULL);
11380+
11381+ if (type != NULL)
11382+ {
11383+ auto target = mModule->GetThis();
11384+ target.mType = type;
11385+
11386+ BfFieldDef* fieldDef = NULL;
11387+
11388+ mResult = LookupField(nameRight, target, fieldName, BfLookupFieldFlag_IsImplicitThis, &fieldDef);
11389+
11390+ if (fieldDef != NULL && fieldDef->IsNonConstStatic())
11391+ {
11392+ mModule->SetHighestElementType(nameRight, BfSourceElementType_Static);
11393+ }
11394+ }
11395+
1136411396 if (!ignoreInitialError)
1136511397 mModule->Fail("Identifier not found", nameNode->mLeft);
1136611398 return;
@@ -11525,6 +11557,23 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode*
1152511557
1152611558 if (!mResult)
1152711559 {
11560+ auto type = mModule->ResolveTypeRef(nameLeft, NULL);
11561+
11562+ if (type != NULL)
11563+ {
11564+ auto target = mModule->GetThis();
11565+ target.mType = type;
11566+
11567+ BfFieldDef* fieldDef = NULL;
11568+
11569+ mResult = LookupField(nameRight, target, fieldName, BfLookupFieldFlag_IsImplicitThis, &fieldDef);
11570+
11571+ if (fieldDef != NULL && fieldDef->IsNonConstStatic())
11572+ {
11573+ mModule->SetHighestElementType(nameRight, BfSourceElementType_Static);
11574+ }
11575+ }
11576+
1152811577 if (!ignoreInitialError)
1152911578 mModule->Fail("Identifier not found", nameLeft);
1153011579 return;
0 commit comments