in Public/Src/FrontEnd/TypeScript.Net/TypeScript.Net/Types/NodeUtilities.cs [906:1035]
public static bool IsExpression(INode node)
{
switch (node.Kind)
{
case SyntaxKind.SuperKeyword:
case SyntaxKind.NullKeyword:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.ArrayLiteralExpression:
case SyntaxKind.ObjectLiteralExpression:
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
case SyntaxKind.CallExpression:
case SyntaxKind.NewExpression:
case SyntaxKind.TaggedTemplateExpression:
case SyntaxKind.AsExpression:
case SyntaxKind.TypeAssertionExpression:
case SyntaxKind.ParenthesizedExpression:
case SyntaxKind.FunctionExpression:
case SyntaxKind.ClassExpression:
case SyntaxKind.ArrowFunction:
case SyntaxKind.VoidExpression:
case SyntaxKind.DeleteExpression:
case SyntaxKind.TypeOfExpression:
case SyntaxKind.PrefixUnaryExpression:
case SyntaxKind.PostfixUnaryExpression:
case SyntaxKind.BinaryExpression:
case SyntaxKind.ConditionalExpression:
case SyntaxKind.SwitchExpression:
case SyntaxKind.SwitchExpressionClause:
case SyntaxKind.SpreadElementExpression:
case SyntaxKind.TemplateExpression:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.OmittedExpression:
case SyntaxKind.YieldExpression:
case SyntaxKind.AwaitExpression:
return true;
case SyntaxKind.QualifiedName:
while (node.Parent.Kind == SyntaxKind.QualifiedName)
{
node = node.Parent;
}
return node.Parent.Kind == SyntaxKind.TypeQuery;
case SyntaxKind.Identifier:
{
if (node.Parent.Kind == SyntaxKind.TypeQuery)
{
return true;
}
goto case SyntaxKind.NumericLiteral;
}
// fall through
case SyntaxKind.NumericLiteral:
case SyntaxKind.StringLiteral:
case SyntaxKind.ThisKeyword:
{
var parent = node.Parent;
switch (parent.Kind)
{
case SyntaxKind.VariableDeclaration:
case SyntaxKind.Parameter:
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.PropertySignature:
case SyntaxKind.EnumMember:
case SyntaxKind.PropertyAssignment:
case SyntaxKind.BindingElement:
return parent.Cast<IVariableLikeDeclaration>().Initializer.ResolveUnionType() == node.ResolveUnionType();
case SyntaxKind.ExpressionStatement:
case SyntaxKind.IfStatement:
case SyntaxKind.DoStatement:
case SyntaxKind.WhileStatement:
case SyntaxKind.ReturnStatement:
case SyntaxKind.WithStatement:
case SyntaxKind.CaseClause:
case SyntaxKind.ThrowStatement:
case SyntaxKind.SwitchStatement:
return parent.Cast<IExpressionStatement>().Expression.ResolveUnionType() == node.ResolveUnionType();
case SyntaxKind.ForStatement:
{
var forStatement = parent.Cast<IForStatement>();
INode initializer = forStatement.Initializer;
return (initializer.ResolveUnionType() == node.ResolveUnionType() && initializer.Kind != SyntaxKind.VariableDeclarationList)
|| forStatement.Condition.ResolveUnionType() == node.ResolveUnionType() || forStatement.Incrementor.ResolveUnionType() == node.ResolveUnionType();
}
case SyntaxKind.ForInStatement:
{
var forInStatement = parent.Cast<IForInStatement>();
return (forInStatement.Initializer.ResolveUnionType() == node.ResolveUnionType() && forInStatement.Initializer.Kind != SyntaxKind.VariableDeclarationList) ||
forInStatement.Expression.ResolveUnionType() == node.ResolveUnionType();
}
case SyntaxKind.ForOfStatement:
{
var forInStatement = parent.Cast<IForOfStatement>();
return (forInStatement.Initializer.ResolveUnionType() == node.ResolveUnionType() && forInStatement.Initializer.Kind != SyntaxKind.VariableDeclarationList) ||
forInStatement.Expression.ResolveUnionType() == node.ResolveUnionType();
}
case SyntaxKind.TypeAssertionExpression:
return node.ResolveUnionType() == parent.Cast<ITypeAssertion>().Expression.ResolveUnionType();
case SyntaxKind.AsExpression:
return node.ResolveUnionType() == parent.Cast<IAsExpression>().Expression.ResolveUnionType();
case SyntaxKind.TemplateSpan:
return node.ResolveUnionType() == parent.Cast<ITemplateSpan>().Expression.ResolveUnionType();
case SyntaxKind.ComputedPropertyName:
return node.ResolveUnionType() == parent.Cast<IComputedPropertyName>().Expression.ResolveUnionType();
case SyntaxKind.Decorator:
return true;
case SyntaxKind.ExpressionWithTypeArguments:
return parent.Cast<IExpressionWithTypeArguments>().Expression.ResolveUnionType() == node.ResolveUnionType() && IsExpressionWithTypeArgumentsInClassExtendsClause(parent);
default:
if (IsExpression(parent))
{
return true;
}
break;
}
}
break;
}
return false;
}