📄 typevisitor.cs
字号:
public override object Visit(PointerReferenceExpression pointerReferenceExpression, object data)
{
return null;
/*
ReturnType type = pointerReferenceExpression.TargetObject.AcceptVisitor(this, data) as ReturnType;
if (type == null) {
return null;
}
type = type.Clone();
--type.PointerNestingLevel;
if (type.PointerNestingLevel != 0) {
return null;
}
return resolver.SearchMember(type, pointerReferenceExpression.Identifier);
*/
}
public override object Visit(IdentifierExpression identifierExpression, object data)
{
if (identifierExpression == null) {
return null;
}
IClass c = resolver.SearchClass(identifierExpression.Identifier);
if (c != null) {
return c.DefaultReturnType;
}
return resolver.DynamicLookup(identifierExpression.Identifier);
}
public override object Visit(TypeReferenceExpression typeReferenceExpression, object data)
{
return CreateReturnType(typeReferenceExpression.TypeReference);
}
public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
{
if (unaryOperatorExpression == null) {
return null;
}
IReturnType expressionType = unaryOperatorExpression.Expression.AcceptVisitor(this, data) as IReturnType;
// TODO: Little bug: unary operator MAY change the return type,
// but that is only a minor issue
switch (unaryOperatorExpression.Op) {
case UnaryOperatorType.Star: // dereference
//--expressionType.PointerNestingLevel;
break;
case UnaryOperatorType.BitWiseAnd: // get reference
//++expressionType.PointerNestingLevel;
break;
}
return expressionType;
}
public override object Visit(AssignmentExpression assignmentExpression, object data)
{
return assignmentExpression.Left.AcceptVisitor(this, data);
}
public override object Visit(SizeOfExpression sizeOfExpression, object data)
{
return CreateReturnType(typeof(int));
}
public override object Visit(TypeOfExpression typeOfExpression, object data)
{
return CreateReturnType(typeof(Type));
}
public override object Visit(CheckedExpression checkedExpression, object data)
{
return checkedExpression.Expression.AcceptVisitor(this, data);
}
public override object Visit(UncheckedExpression uncheckedExpression, object data)
{
return uncheckedExpression.Expression.AcceptVisitor(this, data);
}
public override object Visit(CastExpression castExpression, object data)
{
return CreateReturnType(castExpression.CastTo);
}
public override object Visit(StackAllocExpression stackAllocExpression, object data)
{
/*ReturnType returnType = new ReturnType(stackAllocExpression.TypeReference);
++returnType.PointerNestingLevel;
return returnType;*/
return null;
}
public override object Visit(ClassReferenceExpression classReferenceExpression, object data)
{
if (resolver.CallingClass == null) {
return null;
}
return resolver.CallingClass.DefaultReturnType;
}
public override object Visit(ThisReferenceExpression thisReferenceExpression, object data)
{
if (resolver.CallingClass == null) {
return null;
}
return resolver.CallingClass.DefaultReturnType;
}
public override object Visit(BaseReferenceExpression baseReferenceExpression, object data)
{
if (resolver.CallingClass == null) {
return null;
}
return resolver.CallingClass.BaseType;
}
public override object Visit(ObjectCreateExpression objectCreateExpression, object data)
{
return CreateReturnType(objectCreateExpression.CreateType);
}
public override object Visit(ArrayCreateExpression arrayCreateExpression, object data)
{
return CreateReturnType(arrayCreateExpression.CreateType);
}
public override object Visit(TypeOfIsExpression typeOfIsExpression, object data)
{
return ReflectionReturnType.Bool;
}
public override object Visit(DefaultValueExpression defaultValueExpression, object data)
{
return CreateReturnType(defaultValueExpression.TypeReference);
}
public override object Visit(AnonymousMethodExpression anonymousMethodExpression, object data)
{
AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(resolver.CompilationUnit);
foreach (ParameterDeclarationExpression param in anonymousMethodExpression.Parameters) {
amrt.MethodParameters.Add(NRefactoryASTConvertVisitor.CreateParameter(param, resolver.CallingMember as IMethod, resolver.CallingClass, resolver.CompilationUnit));
}
return amrt;
}
public override object Visit(ArrayInitializerExpression arrayInitializerExpression, object data)
{
// no calls allowed !!!
return null;
}
IReturnType CreateReturnType(TypeReference reference)
{
return CreateReturnType(reference, resolver);
}
IReturnType[] CreateReturnTypes(List<TypeReference> references)
{
if (references == null) return new IReturnType[0];
IReturnType[] types = new IReturnType[references.Count];
for (int i = 0; i < types.Length; i++) {
types[i] = CreateReturnType(references[i]);
}
return types;
}
public static IReturnType CreateReturnType(TypeReference reference, NRefactoryResolver resolver)
{
return CreateReturnType(reference,
resolver.CallingClass, resolver.CallingMember,
resolver.CaretLine, resolver.CaretColumn,
resolver.ProjectContent, false);
}
public static IReturnType CreateReturnType(TypeReference reference, IClass callingClass,
IMember callingMember, int caretLine, int caretColumn,
IProjectContent projectContent,
bool useLazyReturnType)
{
if (reference == null) return null;
if (reference.IsNull) return null;
if (reference is InnerClassTypeReference) {
reference = ((InnerClassTypeReference)reference).CombineToNormalTypeReference();
}
LanguageProperties languageProperties = projectContent.Language;
IReturnType t = null;
if (callingClass != null && !reference.IsGlobal) {
foreach (ITypeParameter tp in callingClass.TypeParameters) {
if (languageProperties.NameComparer.Equals(tp.Name, reference.SystemType)) {
t = new GenericReturnType(tp);
break;
}
}
if (t == null && callingMember is IMethod && (callingMember as IMethod).TypeParameters != null) {
foreach (ITypeParameter tp in (callingMember as IMethod).TypeParameters) {
if (languageProperties.NameComparer.Equals(tp.Name, reference.SystemType)) {
t = new GenericReturnType(tp);
break;
}
}
}
}
if (t == null) {
if (reference.Type != reference.SystemType) {
// keyword-type like void, int, string etc.
t = ProjectContentRegistry.Mscorlib.GetClass(reference.SystemType).DefaultReturnType;
} else {
int typeParameterCount = reference.GenericTypes.Count;
if (useLazyReturnType) {
if (reference.IsGlobal)
t = new GetClassReturnType(projectContent, reference.SystemType, typeParameterCount);
else
t = new SearchClassReturnType(projectContent, callingClass, caretLine, caretColumn, reference.SystemType, typeParameterCount);
} else {
IClass c;
if (reference.IsGlobal) {
c = projectContent.GetClass(reference.SystemType, typeParameterCount);
t = (c != null) ? c.DefaultReturnType : null;
} else {
t = projectContent.SearchType(reference.SystemType, typeParameterCount, callingClass, caretLine, caretColumn);
}
if (t == null) {
if (reference.GenericTypes.Count == 0 && !reference.IsArrayType) {
// reference to namespace is possible
if (reference.IsGlobal) {
if (projectContent.NamespaceExists(reference.Type))
return new NamespaceReturnType(reference.Type);
} else {
string name = projectContent.SearchNamespace(reference.Type, callingClass, (callingClass == null) ? null : callingClass.CompilationUnit, caretLine, caretColumn);
if (name != null)
return new NamespaceReturnType(name);
}
}
return null;
}
}
}
}
if (reference.GenericTypes.Count > 0) {
List<IReturnType> para = new List<IReturnType>(reference.GenericTypes.Count);
for (int i = 0; i < reference.GenericTypes.Count; ++i) {
para.Add(CreateReturnType(reference.GenericTypes[i], callingClass, callingMember, caretLine, caretColumn, projectContent, useLazyReturnType));
}
t = new ConstructedReturnType(t, para);
}
return WrapArray(t, reference);
}
static IReturnType WrapArray(IReturnType t, TypeReference reference)
{
if (reference.IsArrayType) {
for (int i = reference.RankSpecifier.Length - 1; i >= 0; --i) {
t = new ArrayReturnType(t, reference.RankSpecifier[i] + 1);
}
}
return t;
}
public class NamespaceReturnType : AbstractReturnType
{
public NamespaceReturnType(string fullName)
{
this.FullyQualifiedName = fullName;
}
public override IClass GetUnderlyingClass() {
return null;
}
public override List<IMethod> GetMethods() {
return new List<IMethod>();
}
public override List<IProperty> GetProperties() {
return new List<IProperty>();
}
public override List<IField> GetFields() {
return new List<IField>();
}
public override List<IEvent> GetEvents() {
return new List<IEvent>();
}
}
static IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -