protected override Entity InternalResolve <TNode>( GraphStructuredProgram <TNode> program, ResolvedMethod <TNode> sourceMethod, Reference reference) { var classMethodReference = (ClassMethodReference)reference; var resolvedOwner = Resolve(program, sourceMethod, classMethodReference.Owner); if (resolvedOwner is ResolvedClassId owningClassId) { var owner = program.FindClassById(owningClassId); var method = program.GetOrCreateMethod(owner, classMethodReference.Name); var methodId = program.GetOrCreateMethodId(classMethodReference.Name); var resolvedReference = new ResolvedClassMethodReference <TNode>(owningClassId, methodId); resolvedReference.Method = method; return(resolvedReference); } if (resolvedOwner is SecondaryEntity owningEntity) { var methodId = program.GetOrCreateMethodId(classMethodReference.Name); var resolvedReference = new ResolvedObjectMethodReference <TNode>(owningEntity, methodId); resolvedReference.FindClassMethod = program.FindMethodById; sourceMethod.StoreAdditionalVariable(resolvedReference); return(resolvedReference); } return(null); }
protected override Entity RestoreImplementation <TNode>( GraphStructuredProgram <TNode> program, ResolvedMethod <TNode> method, Entity entity) { var objectMethodReference = (ResolvedObjectMethodReference <TNode>)entity; var restoredOwner = (SecondaryEntity)Restore(program, method, objectMethodReference.OwningObject); var restored = new ResolvedObjectMethodReference <TNode>(restoredOwner, objectMethodReference.MethodId) { FindClassMethod = program.FindMethodById }; method.StoreAdditionalVariable(restored); return(restored); }
protected override Entity InternalResolve <TNode>( GraphStructuredProgram <TNode> program, ResolvedMethod <TNode> method, Reference reference) { var classFieldReference = (ClassFieldReference)reference; if (classFieldReference.Owner is ClassReference classReference) { var clazz = program.GetOrCreateClass(classReference.ClassId); var field = program.GetOrCreateClassField(clazz.Id, classFieldReference.Name); if (classFieldReference.DefaultClassType != null) { field.DefaultClassType = program.GetOrCreateClass(classFieldReference.DefaultClassType).Id.GlobalId; } return(field); } else if (classFieldReference.Owner is LocalVariableReference localVariableReference) { var localVariable = method.Variables[localVariableReference.Index]; var fieldId = program.GetOrCreateFieldId(classFieldReference.Name); var resolvedObjectField = new ResolvedObjectField(localVariable, fieldId) { FindClassField = program.FindClassFieldById }; method.StoreAdditionalVariable(resolvedObjectField); return(resolvedObjectField); } else if (classFieldReference.Owner is ClassFieldReference anotherReference) { var resolvedAnotherReference = (SecondaryEntity)Resolve(program, method, anotherReference); var fieldId = program.GetOrCreateFieldId(classFieldReference.Name); var resolvedObjectField = new ResolvedObjectField(resolvedAnotherReference, fieldId) { FindClassField = program.FindClassFieldById }; method.StoreAdditionalVariable(resolvedObjectField); return(resolvedObjectField); } else if (classFieldReference.Owner is ClassPropertyReference propertyReference) { var resolvedAnotherReference = (SecondaryEntity)Resolve(program, method, propertyReference); var fieldId = program.GetOrCreateFieldId(classFieldReference.Name); var resolvedObjectField = new ResolvedObjectField(resolvedAnotherReference, fieldId) { FindClassField = program.FindClassFieldById }; method.StoreAdditionalVariable(resolvedObjectField); return(resolvedObjectField); } Trace.Assert(false); return(null); }