/// <summary> /// Checks a type to determine whether it should use one of the built-in types. /// </summary> /// <param name="type">The type to check.</param> /// <param name="parentElement">The parent element.</param> private void CheckBuiltInType(TypeToken type, Element parentElement) { Param.AssertNotNull(type, "type"); Param.AssertNotNull(parentElement, "parentElement"); if (!type.IsGeneric) { for (int i = 0; i < this.builtInTypes.Length; ++i) { string[] builtInType = this.builtInTypes[i]; if (type.MatchTokens(builtInType[ShortNameIndex]) || type.MatchTokens("System", ".", builtInType[ShortNameIndex])) { // If the previous token is an equals sign, then this is a using alias directive. For example: // using SomeAlias = System.String; bool usingAliasDirective = false; for (LexicalElement previous = type.FindPreviousLexicalElement(); previous != null; previous = previous.FindPreviousLexicalElement()) { if (previous.LexicalElementType != LexicalElementType.Comment && previous.LexicalElementType != LexicalElementType.WhiteSpace && previous.LexicalElementType != LexicalElementType.EndOfLine) { if (previous.Text == "=") { usingAliasDirective = true; } break; } } if (!usingAliasDirective) { this.Violation( Rules.UseBuiltInTypeAlias, new ViolationContext(parentElement, type.LineNumber, builtInType[AliasIndex], builtInType[ShortNameIndex], builtInType[LongNameIndex]), (c, o) => { // Insert a new type token with the correct aliased version of the type. CsDocument document = type.Document; TypeToken aliasType = document.CreateTypeToken(document.CreateLiteralToken(builtInType[AliasIndex])); document.Replace(type, aliasType); }); } break; } } } }