void AbstractMemberNotImplemented(ClassDefinition node, TypeReference baseTypeRef, IMember member) { if (IsValueType(node)) { Error(CompilerErrorFactory.ValueTypeCantHaveAbstractMember(baseTypeRef, node.FullName, GetAbstractMemberSignature(member))); } else if (!node.IsAbstract) { Warnings.Add( CompilerWarningFactory.AbstractMemberNotImplemented(baseTypeRef, node.FullName, GetAbstractMemberSignature(member))); _newAbstractClasses.AddUnique(node); } }
//returns true if a stub has been created, false otherwise. //TODO: add entity argument to the method to not need return type? bool AbstractMemberNotImplemented(ClassDefinition node, TypeReference baseTypeRef, IMember member) { if (IsValueType(node)) { Error(CompilerErrorFactory.ValueTypeCantHaveAbstractMember(baseTypeRef, node.FullName, GetAbstractMemberSignature(member))); return(false); } if (!node.IsAbstract) { //BEHAVIOR >= 0.7.7: (see BOO-789 for details) //create a stub for this not implemented member //it will raise a NotImplementedException if called at runtime TypeMember m = CodeBuilder.CreateStub(member); CompilerWarning warning = null; if (null != m) { //FIXME: cannot reorder upstream? => base before derived foreach (TypeMember existing in node.Members) { if (existing.Name == m.Name) { return(true); } } warning = CompilerWarningFactory.AbstractMemberNotImplementedStubCreated(baseTypeRef, node.FullName, GetAbstractMemberSignature(member)); node.Members.Add(m); } else { warning = CompilerWarningFactory.AbstractMemberNotImplemented(baseTypeRef, node.FullName, GetAbstractMemberSignature(member)); _newAbstractClasses.AddUnique(node); } Warnings.Add(warning); return(null != m); } return(false); }