public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { if (Process(specializedMethodDefinition)) { visitor.Visit(specializedMethodDefinition); } base.Visit(specializedMethodDefinition); }
/// <summary> /// A specialized method definition or generic method instance does not have a body. Given a method definition, /// find the unspecialized version of the definition and fetch the body. /// </summary> /// <param name="methodDefinition"></param> /// <returns></returns> internal static IMethodBody GetMethodBodyFromUnspecializedVersion(IMethodDefinition methodDefinition) { IGenericMethodInstance genericMethodInstance = methodDefinition as IGenericMethodInstance; if (genericMethodInstance != null) { return(GetMethodBodyFromUnspecializedVersion(genericMethodInstance.GenericMethod.ResolvedMethod)); } ISpecializedMethodDefinition specializedMethodDefinition = methodDefinition as ISpecializedMethodDefinition; if (specializedMethodDefinition != null) { return(GetMethodBodyFromUnspecializedVersion(specializedMethodDefinition.UnspecializedVersion.ResolvedMethod)); } return(methodDefinition.Body); }
/// <summary> /// Get the unspecialized method definition is <paramref name="methodDefinition"/> is a specialized /// version, or itself otherwise. /// </summary> /// <param name="methodDefinition"></param> /// <returns></returns> internal static IMethodDefinition UnspecializedMethodDefinition(IMethodDefinition methodDefinition) { IGenericMethodInstance genericMethodInstance = methodDefinition as IGenericMethodInstance; if (genericMethodInstance != null) { methodDefinition = genericMethodInstance.GenericMethod.ResolvedMethod; } ISpecializedMethodDefinition specializedMethodDefinition = methodDefinition as ISpecializedMethodDefinition; if (specializedMethodDefinition != null) { return(specializedMethodDefinition.UnspecializedVersion); } return(methodDefinition); }
private static IMethodBody /*?*/ FirstStatementIsIteratorCreation(IMetadataHost host, ISourceMethodBody possibleIterator, INameTable nameTable, IStatement statement) { ICreateObjectInstance createObjectInstance = GetICreateObjectInstance(statement); if (createObjectInstance == null) { // If the first statement in the method body is not the creation of iterator closure, return a dummy. // Possible corner case not handled: a local is used to hold the constant value for the initial state of the closure. return(null); } ITypeReference closureType /*?*/ = createObjectInstance.MethodToCall.ContainingType; ITypeReference unspecializedClosureType = ContractHelper.Unspecialized(closureType); if (!AttributeHelper.Contains(unspecializedClosureType.Attributes, host.PlatformType.SystemRuntimeCompilerServicesCompilerGeneratedAttribute)) { return(null); } INestedTypeReference closureTypeAsNestedTypeReference = unspecializedClosureType as INestedTypeReference; if (closureTypeAsNestedTypeReference == null) { return(null); } ITypeReference unspecializedClosureContainingType = ContractHelper.Unspecialized(closureTypeAsNestedTypeReference.ContainingType); if (closureType != null && TypeHelper.TypesAreEquivalent(possibleIterator.MethodDefinition.ContainingTypeDefinition, unspecializedClosureContainingType)) { IName MoveNextName = nameTable.GetNameFor("MoveNext"); foreach (ITypeDefinitionMember member in closureType.ResolvedType.GetMembersNamed(MoveNextName, false)) { IMethodDefinition moveNext = member as IMethodDefinition; if (moveNext != null) { ISpecializedMethodDefinition moveNextGeneric = moveNext as ISpecializedMethodDefinition; if (moveNextGeneric != null) { moveNext = moveNextGeneric.UnspecializedVersion.ResolvedMethod; } return(moveNext.Body); } } } return(null); }
public virtual void onMetadataElement(ISpecializedMethodDefinition specializedMethodDefinition) { }
/// <summary> /// Performs some computation with the given specialized method definition. /// </summary> public void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { this.Visit((IMethodDefinition)specializedMethodDefinition); }
public void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { //references are dispatched in such a way that they never get here. //thus, assume that we are traversing a generic type instance. this.traverser.Traverse((IMethodDefinition)specializedMethodDefinition); }
/// <summary> /// Performs some computation with the given specialized method definition. /// </summary> public virtual void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { }
public void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { throw new NotImplementedException(); }
public virtual void onMetadataElement(ISpecializedMethodDefinition specializedMethodDefinition) { }
/// <summary> /// Performs some computation with the given specialized method definition. /// </summary> public virtual void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { }
public static ITypeMemberReference CanonicalizeMemberReference(ITypeMemberReference member) { if (null == member) { return(null); } if (member == null || member == Dummy.Method) { throw new Exception("Can't resolve member"); } // function pointers don't have declaring types and they don't // really fit our model, so we ignore them. if (null == member.ContainingType) { return(null); } // // first canonicalize the method... // IGenericMethodInstanceReference genMeth = member as IGenericMethodInstanceReference; if ((genMeth != null)) { member = genMeth.GenericMethod; } ISpecializedMethodReference specializedMethodRef = member as ISpecializedMethodReference; ISpecializedFieldReference specializedFieldRef = member as ISpecializedFieldReference; ISpecializedPropertyDefinition specializedPropertyDef = member as ISpecializedPropertyDefinition; ISpecializedEventDefinition specializedEventDef = member as ISpecializedEventDefinition; ISpecializedMethodDefinition specializedMethodDef = member as ISpecializedMethodDefinition; ISpecializedFieldDefinition specializedFieldDef = member as ISpecializedFieldDefinition; if (specializedMethodRef != null) { member = specializedMethodRef.UnspecializedVersion; } else if (specializedFieldRef != null) { member = specializedFieldRef.UnspecializedVersion; } else if (specializedPropertyDef != null) { member = specializedPropertyDef.UnspecializedVersion; } else if (specializedEventDef != null) { member = specializedEventDef.UnspecializedVersion; } else if (specializedMethodDef != null) { member = specializedMethodDef.UnspecializedVersion; } else if (specializedFieldDef != null) { member = specializedFieldDef.UnspecializedVersion; } if (member == null) { throw new Exception("Can't canonicalize some member."); } return(member); }
public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { allElements.Add(new InvokInfo(Traverser, "ISpecializedMethodDefinition", specializedMethodDefinition)); }
public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition) { if(Process(specializedMethodDefinition)){visitor.Visit(specializedMethodDefinition);} base.Visit(specializedMethodDefinition); }