diff options
Diffstat (limited to 'source/slang/slang-syntax.cpp')
| -rw-r--r-- | source/slang/slang-syntax.cpp | 98 |
1 files changed, 51 insertions, 47 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp index 957d4e661..9a7200e9d 100644 --- a/source/slang/slang-syntax.cpp +++ b/source/slang/slang-syntax.cpp @@ -355,6 +355,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt DeclRef<Decl> createDefaultSubstitutionsIfNeeded( ASTBuilder* astBuilder, + SemanticsVisitor* semantics, DeclRef<Decl> declRef) { // It is possible that `declRef` refers to a generic type, @@ -413,7 +414,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt if(!foundSubst) { Substitutions* newSubst = createDefaultSubstitutionsForGeneric( - astBuilder, + astBuilder, + semantics, genericParentDecl, nullptr); @@ -436,7 +438,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt ASTBuilder* astBuilder, DeclRef<Decl> declRef) { - declRef = createDefaultSubstitutionsIfNeeded(astBuilder, declRef); + declRef = createDefaultSubstitutionsIfNeeded(astBuilder, nullptr, declRef); if (auto builtinMod = declRef.getDecl()->findModifier<BuiltinTypeModifier>()) { @@ -458,58 +460,60 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt if (magicMod->magicName == "SamplerState") { - auto type = astBuilder->create<SamplerStateType>(); + auto type = astBuilder->getOrCreate<SamplerStateType>(SamplerStateFlavor(magicMod->tag)); type->declRef = declRef; - type->flavor = SamplerStateFlavor(magicMod->tag); return type; } else if (magicMod->magicName == "Vector") { - SLANG_ASSERT(subst && subst->args.getCount() == 2); - auto vecType = astBuilder->create<VectorExpressionType>(); + SLANG_ASSERT(subst && subst->getArgs().getCount() == 2); + auto vecType = astBuilder->getOrCreate<VectorExpressionType>(ExtractGenericArgType(subst->getArgs()[0]), ExtractGenericArgInteger(subst->getArgs()[1])); vecType->declRef = declRef; - vecType->elementType = ExtractGenericArgType(subst->args[0]); - vecType->elementCount = ExtractGenericArgInteger(subst->args[1]); + vecType->elementType = ExtractGenericArgType(subst->getArgs()[0]); + vecType->elementCount = ExtractGenericArgInteger(subst->getArgs()[1]); return vecType; } else if (magicMod->magicName == "Matrix") { - SLANG_ASSERT(subst && subst->args.getCount() == 3); - auto matType = astBuilder->create<MatrixExpressionType>(); + SLANG_ASSERT(subst && subst->getArgs().getCount() == 3); + auto matType = astBuilder->getOrCreate<MatrixExpressionType>( + ExtractGenericArgType(subst->getArgs()[0]), + ExtractGenericArgInteger(subst->getArgs()[1]), + ExtractGenericArgInteger(subst->getArgs()[2])); matType->declRef = declRef; return matType; } else if (magicMod->magicName == "Texture") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); - auto textureType = astBuilder->create<TextureType>( + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); + auto textureType = astBuilder->getOrCreate<TextureType>( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "TextureSampler") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); auto textureType = astBuilder->create<TextureSamplerType>( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "GLSLImageType") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); - auto textureType = astBuilder->create<GLSLImageType>( + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); + auto textureType = astBuilder->getOrCreate<GLSLImageType>( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "FeedbackType") { SLANG_ASSERT(subst == nullptr); - auto type = astBuilder->create<FeedbackType>(); + auto type = astBuilder->getOrCreateWithDefaultCtor<FeedbackType>(magicMod->tag); type->declRef = declRef; type->kind = FeedbackType::Kind(magicMod->tag); return type; @@ -519,11 +523,13 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt // and we can drive the dispatch with a table instead // of this ridiculously slow `if` cascade. - #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - auto type = astBuilder->create<T>(); \ - type->declRef = declRef; \ - return type; \ + #define CASE(n, T) \ + else if (magicMod->magicName == #n) \ + { \ + auto type = astBuilder->getOrCreateWithDefaultCtor<T>( \ + declRef.decl, declRef.substitutions.substitutions); \ + type->declRef = declRef; \ + return type; \ } CASE(HLSLInputPatchType, HLSLInputPatchType) @@ -531,14 +537,16 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt #undef CASE - #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - SLANG_ASSERT(subst && subst->args.getCount() == 1); \ - auto type = astBuilder->create<T>(); \ - type->elementType = ExtractGenericArgType(subst->args[0]); \ - type->declRef = declRef; \ - return type; \ - } + #define CASE(n, T) \ + else if (magicMod->magicName == #n) \ + { \ + SLANG_ASSERT(subst && subst->getArgs().getCount() == 1); \ + auto type = \ + astBuilder->getOrCreateWithDefaultCtor<T>(ExtractGenericArgType(subst->getArgs()[0])); \ + type->elementType = ExtractGenericArgType(subst->getArgs()[0]); \ + type->declRef = declRef; \ + return type; \ + } CASE(ConstantBuffer, ConstantBufferType) CASE(TextureBuffer, TextureBufferType) @@ -561,8 +569,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt // "magic" builtin types which have no generic parameters #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - auto type = astBuilder->create<T>(); \ + else if(magicMod->magicName == #n) { \ + auto type = astBuilder->getOrCreate<T>(); \ type->declRef = declRef; \ return type; \ } @@ -601,7 +609,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt } else { - return astBuilder->create<DeclRefType>(declRef); + return astBuilder->getOrCreateDeclRefType(declRef.decl, declRef.substitutions.substitutions); } } @@ -786,10 +794,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt substsToApply, &diff); - GenericSubstitution* firstSubst = astBuilder->create<GenericSubstitution>(); - firstSubst->genericDecl = ancestorGenericDecl; - firstSubst->args = appGenericSubst->args; - firstSubst->outer = restSubst; + GenericSubstitution* firstSubst = astBuilder->getOrCreateGenericSubstitution( + ancestorGenericDecl, appGenericSubst->getArgs(), restSubst); (*ioDiff)++; return firstSubst; @@ -849,10 +855,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt substsToApply, &diff); - ThisTypeSubstitution* firstSubst = astBuilder->create<ThisTypeSubstitution>(); - firstSubst->interfaceDecl = ancestorInterfaceDecl; - firstSubst->witness = appThisTypeSubst->witness; - firstSubst->outer = restSubst; + ThisTypeSubstitution* firstSubst = astBuilder->getOrCreateThisTypeSubstitution( + ancestorInterfaceDecl, appThisTypeSubst->witness, restSubst); (*ioDiff)++; return firstSubst; @@ -1013,12 +1017,12 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt Type* HLSLPatchType::getElementType() { - return as<Type>(findInnerMostGenericSubstitution(declRef.substitutions)->args[0]); + return as<Type>(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[0]); } IntVal* HLSLPatchType::getElementCount() { - return as<IntVal>(findInnerMostGenericSubstitution(declRef.substitutions)->args[1]); + return as<IntVal>(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[1]); } // Constructors for types @@ -1047,7 +1051,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt ASTBuilder* astBuilder, DeclRef<TypeDefDecl> const& declRef) { - DeclRef<TypeDefDecl> specializedDeclRef = createDefaultSubstitutionsIfNeeded(astBuilder, declRef).as<TypeDefDecl>(); + DeclRef<TypeDefDecl> specializedDeclRef = createDefaultSubstitutionsIfNeeded(astBuilder, nullptr, declRef).as<TypeDefDecl>(); return astBuilder->create<NamedExpressionType>(specializedDeclRef); } @@ -1179,7 +1183,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt { out << "<"; bool isFirst = true; - for (const auto& it : genericSubstitution->args) + for (const auto& it : genericSubstitution->getArgs()) { if (!isFirst) out << ", "; |
