Skip to content
This repository has been archived by the owner on Oct 4, 2021. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
[Debugger] Various fixes to the expression type resolver
  • Loading branch information
jstedfast committed Feb 15, 2013
1 parent 48a0e55 commit d6195f8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 34 deletions.
Expand Up @@ -344,7 +344,7 @@ static ValueReference ResolveTypeValueReference (EvaluationContext ctx, AstType
return new TypeValueReference (ctx, resolved);
}

throw ParseError ("Could not resolve type: {0}", type);
throw ParseError ("Could not resolve type: {0}", ResolveTypeName (type));
}

#region IAstVisitor implementation
Expand Down
Expand Up @@ -77,64 +77,55 @@ internal string GetResolvedExpression ()
return sb.ToString ();
}

void ResolveType (string typeName, int genericArgCount, int offset, int length)
void ReplaceType (string name, int offset, int length)
{
if (genericArgCount > 0)
typeName += "<" + new string (',', genericArgCount - 1) + ">";

string type = session.ResolveIdentifierAsType (typeName, location);
string type = session.ResolveIdentifierAsType (name, location);
if (!string.IsNullOrEmpty (type)) {
type = "global::" + type;
Replacement r = new Replacement () { Offset = offset, Length = length, NewText = type };
replacements.Add (r);
}
}

void ReplaceType (AstType type)
{
int length = type.EndLocation.Column - type.StartLocation.Column;
int offset = type.StartLocation.Column - 1;

ReplaceType (type.ToString (), offset, length);
}

public override void VisitIdentifierExpression (IdentifierExpression identifierExpression)
{
base.VisitIdentifierExpression (identifierExpression);

int length = identifierExpression.EndLocation.Column - identifierExpression.StartLocation.Column;
int offset = identifierExpression.StartLocation.Column - 1;

ResolveType (identifierExpression.Identifier, 0, offset, length);
ReplaceType (identifierExpression.Identifier, offset, length);
}

public override void VisitTypeReferenceExpression (TypeReferenceExpression typeReferenceExpression)
{
base.VisitTypeReferenceExpression (typeReferenceExpression);

int length = typeReferenceExpression.EndLocation.Column - typeReferenceExpression.StartLocation.Column;
int offset = typeReferenceExpression.StartLocation.Column - 1;
int index = expression.IndexOf ('<', offset);
int count = 0;

if (index != -1 && index < offset + length) {
if (expression[offset + length - 1] != '>')
return;

int end = offset + length - 1;
int start = index + 1;
string[] args;

if (!FunctionBreakpoint.TryParseParameters (expression, start, end - start, out args))
return;
ReplaceType (typeReferenceExpression.Type);
}

length = index - offset;
count = args.Length;
}
public override void VisitComposedType (ComposedType composedType)
{
// Note: we specifically do not handle this case because the 'base' implementation will eventually
// call VisitMemberType() or VisitSimpleType() on the ComposedType.BaseType which is all we really
// care to resolve.
base.VisitComposedType (composedType);
}

ResolveType (expression.Substring (offset, length), count, offset, length);
public override void VisitMemberType (MemberType memberType)
{
ReplaceType (memberType);
}

public override void VisitSimpleType (SimpleType simpleType)
{
base.VisitSimpleType (simpleType);

int length = simpleType.EndLocation.Column - simpleType.StartLocation.Column;
int offset = simpleType.StartLocation.Column - 1;

ResolveType (simpleType.Identifier, 0, offset, length);
ReplaceType (simpleType);
}
}
}

0 comments on commit d6195f8

Please sign in to comment.