/// <summary> /// Create a type builder for the given type. /// </summary> internal static IClassBuilder[] Create(ReachableContext context, AssemblyCompiler compiler, TypeDefinition typeDef) { if (typeDef.FullName == "<Module>") return new IClassBuilder[] { new SkipClassBuilder() }; if (typeDef.IsDelegate()) return new IClassBuilder[] {new DelegateClassBuilder(context, compiler, typeDef) }; if (typeDef.IsAttribute()) return new IClassBuilder[] {new AttributeClassBuilder(context, compiler, typeDef) }; if (typeDef.IsAnnotation()) return new IClassBuilder[] {new AnnotationClassBuilder(context, compiler, typeDef) }; if (typeDef.HasDexImportAttribute()) return new IClassBuilder[] {new DexImportClassBuilder(context, compiler, typeDef) }; if (typeDef.HasJavaImportAttribute()) return new IClassBuilder[] {CreateJavaImportBuilder(context, compiler, typeDef)}; if (typeDef.IsEnum) { if (typeDef.UsedInNullableT) { var nullableBaseClassBuilder = new NullableEnumBaseClassBuilder(context, compiler, typeDef); IClassBuilder builder = new EnumClassBuilder(context, compiler, typeDef, nullableBaseClassBuilder); return new[] { builder, nullableBaseClassBuilder }; } return new IClassBuilder[] { new EnumClassBuilder(context, compiler, typeDef, null) }; } else { IClassBuilder builder = new StandardClassBuilder(context, compiler, typeDef); if (typeDef.UsedInNullableT) return new[] { builder, new NullableBaseClassBuilder(context, compiler, typeDef) }; return new[] { builder }; } }
public RuleResult CheckType (TypeDefinition type) { // rule applies only to attributes if (!type.IsAttribute ()) return RuleResult.DoesNotApply; if (type.HasAttribute ("System", "AttributeUsageAttribute")) // it's ok return RuleResult.Success; Runner.Report (type, Severity.High, Confidence.Total); return RuleResult.Failure; }
public RuleResult CheckType(TypeDefinition type) { // rule applies only to attributes if (!type.IsAttribute ()) return RuleResult.DoesNotApply; if (type.IsAbstract) // it's ok return RuleResult.Success; if (type.IsSealed) // it's ok return RuleResult.Success; Runner.Report (type, Severity.Medium, Confidence.High); return RuleResult.Failure; }
public RuleResult CheckType (TypeDefinition type) { // rule applies only to attributes if (!type.IsAttribute ()) return RuleResult.DoesNotApply; // look through getters allProperties.Clear (); foreach (PropertyDefinition property in type.Properties) { if (property.GetMethod != null) { allProperties.Add (property.Name); } } // look through parameters foreach (MethodDefinition constructor in type.GetConstructors ()) { foreach (ParameterDefinition param in constructor.Parameters) { // pascal case it string correspondingPropertyName = Char.ToUpper (param.Name [0]).ToString () + param.Name.Substring (1); if (!allProperties.Contains (correspondingPropertyName)) { string s = String.Format ("Add '{0}' property to the attribute class.", correspondingPropertyName); Runner.Report (param, Severity.Medium, Confidence.High, s); allProperties.Add (correspondingPropertyName); // to avoid double catching same property (e.g. from different constructors) } } } return Runner.CurrentRuleResult; }
public RuleResult CheckType (TypeDefinition type) { // rule applies only to attributes if (!type.IsAttribute ()) return RuleResult.DoesNotApply; // look through getters allProperties.Clear (); TypeDefinition t = type; // Walk up the inheritance tree so that inherited properties are counted do { foreach (PropertyDefinition property in t.Properties) { if (property.GetMethod != null) { allProperties.Add (property.Name); } } t = t.BaseType != null ? t.BaseType.Resolve () : null; } while (t != null && !t.IsNamed ("System", "Attribute")); // look through parameters foreach (MethodDefinition constructor in type.Methods) { if (!constructor.IsConstructor) continue; foreach (ParameterDefinition param in constructor.Parameters) { // pascal case it string correspondingPropertyName = Char.ToUpper (param.Name [0], CultureInfo.InvariantCulture).ToString (CultureInfo.InvariantCulture) + param.Name.Substring (1); if (!allProperties.Contains (correspondingPropertyName)) { string s = String.Format (CultureInfo.InvariantCulture, "Add '{0}' property to the attribute class.", correspondingPropertyName); Runner.Report (param, Severity.Medium, Confidence.High, s); allProperties.Add (correspondingPropertyName); // to avoid double catching same property (e.g. from different constructors) } } } return Runner.CurrentRuleResult; }