summaryrefslogtreecommitdiffstats
path: root/source/slang/check.cpp
diff options
context:
space:
mode:
authorTim Foley <tim.foley.is@gmail.com>2017-08-14 18:50:46 -0700
committerGitHub <noreply@github.com>2017-08-14 18:50:46 -0700
commitaeb247cdf02e4dcfc0bb6839cfd291be5128f8ad (patch)
tree7314b26e21ded966b6a4fe2430f0421c0c0970bd /source/slang/check.cpp
parentbb66d6eddd649d8861cecefa2d6ccb7a28a827bc (diff)
parent9885c972a6bfa6f856e505cdd90d9b71fdbdadaf (diff)
Merge pull request #159 from tfoleyNV/name-type
Name type
Diffstat (limited to 'source/slang/check.cpp')
-rw-r--r--source/slang/check.cpp75
1 files changed, 41 insertions, 34 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp
index bb0b1b794..cc2954fc4 100644
--- a/source/slang/check.cpp
+++ b/source/slang/check.cpp
@@ -147,7 +147,7 @@ namespace Slang
if (baseExpr)
{
auto expr = new MemberExpr();
- expr->Position = originalExpr->Position;
+ expr->loc = originalExpr->loc;
expr->BaseExpression = baseExpr;
expr->name = declRef.GetName();
expr->type = GetTypeForDeclRef(declRef);
@@ -157,7 +157,7 @@ namespace Slang
else
{
auto expr = new VarExpr();
- expr->Position = originalExpr->Position;
+ expr->loc = originalExpr->loc;
expr->name = declRef.GetName();
expr->type = GetTypeForDeclRef(declRef);
expr->declRef = declRef;
@@ -173,7 +173,7 @@ namespace Slang
SLANG_ASSERT(ptrLikeType);
auto derefExpr = new DerefExpr();
- derefExpr->Position = originalExpr->Position;
+ derefExpr->loc = originalExpr->loc;
derefExpr->base = base;
derefExpr->type = QualType(ptrLikeType->elementType);
@@ -217,7 +217,7 @@ namespace Slang
if (lookupResult.isOverloaded())
{
auto overloadedExpr = new OverloadedExpr();
- overloadedExpr->Position = originalExpr->Position;
+ overloadedExpr->loc = originalExpr->loc;
overloadedExpr->type = QualType(
getSession()->getOverloadedType());
overloadedExpr->base = baseExpr;
@@ -823,7 +823,7 @@ namespace Slang
if(outToExpr)
{
auto toInitializerListExpr = new InitializerListExpr();
- toInitializerListExpr->Position = fromInitializerListExpr->Position;
+ toInitializerListExpr->loc = fromInitializerListExpr->loc;
toInitializerListExpr->type = QualType(toType);
toInitializerListExpr->args = coercedArgs;
@@ -1007,7 +1007,7 @@ namespace Slang
castExpr = new ImplicitCastExpr();
}
- castExpr->Position = fromExpr->Position;
+ castExpr->loc = fromExpr->loc;
castExpr->TargetType.type = toType;
castExpr->type = QualType(toType);
castExpr->Expression = fromExpr;
@@ -1042,7 +1042,7 @@ namespace Slang
{
if(!isRewriteMode())
{
- getSink()->diagnose(fromExpr->Position, Diagnostics::typeMismatch, toType, fromExpr->type);
+ getSink()->diagnose(fromExpr->loc, Diagnostics::typeMismatch, toType, fromExpr->type);
}
// Note(tfoley): We don't call `CreateErrorExpr` here, because that would
@@ -1190,7 +1190,7 @@ namespace Slang
{
if (!isRewriteMode())
{
- getSink()->diagnose(expr->Position, Diagnostics::expectedIntegerConstantNotLiteral);
+ getSink()->diagnose(expr->loc, Diagnostics::expectedIntegerConstantNotLiteral);
}
return nullptr;
}
@@ -1234,7 +1234,7 @@ namespace Slang
// For now we will do this in a completely ad hoc fashion,
// but it would be nice to have some generic routine to
// do the needed type checking/coercion.
- if(hlslUncheckedAttribute->nameToken.Content == "numthreads")
+ if(getText(hlslUncheckedAttribute->getName()) == "numthreads")
{
if(hlslUncheckedAttribute->args.Count() != 3)
return m;
@@ -1249,8 +1249,8 @@ namespace Slang
auto hlslNumThreadsAttribute = new HLSLNumThreadsAttribute();
- hlslNumThreadsAttribute->Position = hlslUncheckedAttribute->Position;
- hlslNumThreadsAttribute->nameToken = hlslUncheckedAttribute->nameToken;
+ hlslNumThreadsAttribute->loc = hlslUncheckedAttribute->loc;
+ hlslNumThreadsAttribute->name = hlslUncheckedAttribute->getName();
hlslNumThreadsAttribute->args = hlslUncheckedAttribute->args;
hlslNumThreadsAttribute->x = (int32_t) xVal->value;
hlslNumThreadsAttribute->y = (int32_t) yVal->value;
@@ -1614,20 +1614,20 @@ namespace Slang
this->function = functionNode;
auto returnType = CheckProperType(functionNode->ReturnType);
functionNode->ReturnType = returnType;
- HashSet<String> paraNames;
+ HashSet<Name*> paraNames;
for (auto & para : functionNode->GetParameters())
{
checkDecl(para);
- if (paraNames.Contains(para->Name.Content))
+ if (paraNames.Contains(para->getName()))
{
if (!isRewriteMode())
{
- getSink()->diagnose(para, Diagnostics::parameterAlreadyDefined, para->Name);
+ getSink()->diagnose(para, Diagnostics::parameterAlreadyDefined, para->getName());
}
}
else
- paraNames.Add(para->Name.Content);
+ paraNames.Add(para->getName());
}
this->function = NULL;
functionNode->SetCheckState(DeclCheckState::CheckedHeader);
@@ -2062,6 +2062,11 @@ namespace Slang
return new ConstantIntVal(expr->integerValue);
}
+ Name* getName(String const& text)
+ {
+ return getCompileRequest()->getNamePool()->getName(text);
+ }
+
RefPtr<IntVal> TryConstantFoldExpr(
InvokeExpr* invokeExpr)
{
@@ -2127,7 +2132,7 @@ namespace Slang
auto opName = funcDeclRef.GetName();
// handle binary operators
- if (opName == "-")
+ if (opName == getName("-"))
{
if (argCount == 1)
{
@@ -2140,8 +2145,8 @@ namespace Slang
}
// simple binary operators
-#define CASE(OP) \
- else if(opName == #OP) do { \
+#define CASE(OP) \
+ else if(opName == getName(#OP)) do { \
if(argCount != 2) return nullptr; \
resultValue = constArgVals[0] OP constArgVals[1]; \
} while(0)
@@ -2152,8 +2157,8 @@ namespace Slang
// binary operators with chance of divide-by-zero
// TODO: issue a suitable error in that case
-#define CASE(OP) \
- else if(opName == #OP) do { \
+#define CASE(OP) \
+ else if(opName == getName(#OP)) do { \
if(argCount != 2) return nullptr; \
if(!constArgVals[1]) return nullptr; \
resultValue = constArgVals[0] OP constArgVals[1]; \
@@ -2445,7 +2450,7 @@ namespace Slang
// it must match what the parser installed in subscript declarations.
LookupResult lookupResult = LookUpLocal(
getSession(),
- this, "operator[]", aggTypeDeclRef);
+ this, getName("operator[]"), aggTypeDeclRef);
if (!lookupResult.isValid())
{
goto fail;
@@ -2458,7 +2463,7 @@ namespace Slang
// we will construct a reference to it and try to call it
RefPtr<InvokeExpr> subscriptCallExpr = new InvokeExpr();
- subscriptCallExpr->Position = subscriptExpr->Position;
+ subscriptCallExpr->loc = subscriptExpr->loc;
subscriptCallExpr->FunctionExpr = subscriptFuncExpr;
// TODO(tfoley): This path can support multiple arguments easily
@@ -4126,7 +4131,7 @@ namespace Slang
sb << ".";
}
- sb << declRef.GetName();
+ sb << getText(declRef.GetName());
// If the parent declaration is a generic, then we need to print out its
// signature
@@ -4179,7 +4184,7 @@ namespace Slang
if (!first) sb << ", ";
first = false;
- sb << genericTypeParam.GetName();
+ sb << getText(genericTypeParam.GetName());
}
else if(auto genericValParam = paramDeclRef.As<GenericValueParamDecl>())
{
@@ -4188,7 +4193,7 @@ namespace Slang
formatType(sb, GetType(genericValParam));
sb << " ";
- sb << genericValParam.GetName();
+ sb << getText(genericValParam.GetName());
}
else
{}
@@ -4286,7 +4291,7 @@ namespace Slang
}
}
- String funcName;
+ Name* funcName = nullptr;
if (auto baseVar = funcExpr.As<VarExpr>())
funcName = baseVar->name;
else if(auto baseMemberRef = funcExpr.As<MemberExpr>())
@@ -4298,7 +4303,7 @@ namespace Slang
{
// There were multple equally-good candidates, but none actually usable.
// We will construct a diagnostic message to help out.
- if (funcName.Length() != 0)
+ if (funcName)
{
if (!isRewriteMode())
{
@@ -4317,7 +4322,7 @@ namespace Slang
{
// There were multiple applicable candidates, so we need to report them.
- if (funcName.Length() != 0)
+ if (funcName)
{
if (!isRewriteMode())
{
@@ -4559,7 +4564,7 @@ namespace Slang
{
if (!isRewriteMode())
{
- getSink()->diagnose(expr->Arguments[i], Diagnostics::argumentExpectedLValue, (*params)[i]->Name);
+ getSink()->diagnose(expr->Arguments[i], Diagnostics::argumentExpectedLValue, (*params)[i]->getName());
}
}
}
@@ -4732,7 +4737,7 @@ namespace Slang
IntegerLiteralValue baseElementCount)
{
RefPtr<SwizzleExpr> swizExpr = new SwizzleExpr();
- swizExpr->Position = memberRefExpr->Position;
+ swizExpr->loc = memberRefExpr->loc;
swizExpr->base = memberRefExpr->BaseExpression;
IntegerLiteralValue limitElement = baseElementCount;
@@ -4744,9 +4749,11 @@ namespace Slang
bool anyDuplicates = false;
bool anyError = false;
- for (UInt i = 0; i < memberRefExpr->name.Length(); i++)
+ auto swizzleText = getText(memberRefExpr->name);
+
+ for (UInt i = 0; i < swizzleText.Length(); i++)
{
- auto ch = memberRefExpr->name[i];
+ auto ch = swizzleText[i];
int elementIndex = -1;
switch (ch)
{
@@ -5014,11 +5021,11 @@ namespace Slang
// be loaded), and then put its declarations into
// the current scope.
- auto name = decl->nameToken.Content;
+ auto name = decl->moduleNameAndLoc.name;
auto scope = decl->scope;
// Try to load a module matching the name
- auto importedModuleDecl = findOrImportModule(request, name, decl->nameToken.Position);
+ auto importedModuleDecl = findOrImportModule(request, name, decl->moduleNameAndLoc.loc);
// If we didn't find a matching module, then bail out
if (!importedModuleDecl)