diff options
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index f4c8cd847..a530eb8f0 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -455,21 +455,24 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr( // Another exception is if we are accessing a property // that provides a [nonmutating] setter. - if (!expr->type.isLeftValue && as<PropertyDecl>(declRef.getDecl())) + if (!expr->type.isLeftValue) { - bool isLValue = false; - for (auto member : as<ContainerDecl>(declRef.getDecl())->members) + if (auto propertyDecl = as<PropertyDecl>(declRef.getDecl())) { - if (as<SetterDecl>(member) || as<RefAccessorDecl>(member)) + bool isLValue = false; + for (auto member : propertyDecl->getDirectMemberDeclsOfType<AccessorDecl>()) { - if (member->findModifier<NonmutatingAttribute>()) + if (as<SetterDecl>(member) || as<RefAccessorDecl>(member)) { - isLValue = true; + if (member->findModifier<NonmutatingAttribute>()) + { + isLValue = true; + } + break; } - break; } + expr->type.isLeftValue = isLValue; } - expr->type.isLeftValue = isLValue; } } else @@ -479,7 +482,7 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr( if (auto propertyDecl = as<PropertyDecl>(declRef.getDecl())) { bool isLValue = false; - for (auto member : propertyDecl->members) + for (auto member : propertyDecl->getDirectMemberDeclsOfType<AccessorDecl>()) { if (as<SetterDecl>(member) || as<RefAccessorDecl>(member)) { @@ -681,12 +684,11 @@ Expr* SemanticsVisitor::maybeUseSynthesizedDeclForLookupResult( createDefaultSubstitutionsIfNeeded(m_astBuilder, this, makeDeclRef(structDecl)); typeDef->type.type = DeclRefType::create(m_astBuilder, synthDeclRef); - structDecl->members.add(typeDef); + structDecl->addDirectMemberDecl(typeDef); synthesizedDecl->nameAndLoc.name = item.declRef.getName(); synthesizedDecl->loc = parent->loc; - parent->addMember(synthesizedDecl); - parent->invalidateMemberDictionary(); + parent->addDirectMemberDecl(synthesizedDecl); // Mark the newly synthesized decl as `ToBeSynthesized` so future checking can // differentiate it from user-provided definitions, and proceed to fill in its @@ -711,8 +713,7 @@ Expr* SemanticsVisitor::maybeUseSynthesizedDeclForLookupResult( synthesizedDecl = parent; - parent->addMember(typeDef); - parent->invalidateMemberDictionary(); + parent->addDirectMemberDecl(typeDef); markSelfDifferentialMembersOfType(parent, subType); } @@ -1293,17 +1294,14 @@ bool SemanticsVisitor::canStructBeUsedAsSelfDifferentialType(AggTypeDecl* aggTyp // and their differential types are the same as the original types. // bool canBeUsed = true; - for (auto member : aggTypeDecl->members) + for (auto varDecl : aggTypeDecl->getDirectMemberDeclsOfType<VarDecl>()) { - if (auto varDecl = as<VarDecl>(member)) + // Try to get the differential type of the member. + Type* diffType = tryGetDifferentialType(getASTBuilder(), varDecl->getType()); + if (!diffType || !diffType->equals(varDecl->getType())) { - // Try to get the differential type of the member. - Type* diffType = tryGetDifferentialType(getASTBuilder(), varDecl->getType()); - if (!diffType || !diffType->equals(varDecl->getType())) - { - canBeUsed = false; - break; - } + canBeUsed = false; + break; } } return canBeUsed; @@ -4290,7 +4288,7 @@ Expr* SemanticsExprVisitor::visitLambdaExpr(LambdaExpr* lambdaExpr) { nameBuilder << getText(m_parentFunc->getName()); nameBuilder << "_"; - nameBuilder << m_parentFunc->members.getCount(); + nameBuilder << m_parentFunc->getDirectMemberDeclCount(); } auto name = getName(nameBuilder.getBuffer()); lambdaStructDecl->nameAndLoc.name = name; @@ -4315,7 +4313,7 @@ Expr* SemanticsExprVisitor::visitLambdaExpr(LambdaExpr* lambdaExpr) synthesizer.popScope(); funcDecl->body = lambdaExpr->bodyStmt; - for (auto param : lambdaExpr->paramScopeDecl->members) + for (auto param : lambdaExpr->paramScopeDecl->getDirectMemberDecls()) { funcDecl->addMember(param); } |
