public AssemblyQualifiedTypeName(NonQualifiedTypeName nonQualifiedTypeName, RuntimeAssemblyName assemblyName) { Debug.Assert(nonQualifiedTypeName != null); Debug.Assert(assemblyName != null); _nonQualifiedTypeName = nonQualifiedTypeName; _assemblyName = assemblyName; }
// // Parse a generic argument. In particular, generic arguments can take the special form [<typename>,<assemblyname>]. // private TypeName ParseGenericTypeArgument() { TokenType token = _lexer.GetNextToken(); if (token == TokenType.Other) { NonQualifiedTypeName nonQualifiedTypeName = ParseNonQualifiedTypeName(); return(new AssemblyQualifiedTypeName(nonQualifiedTypeName, null)); } else if (token == TokenType.OpenSqBracket) { RuntimeAssemblyName assemblyName = null; NonQualifiedTypeName typeName = ParseNonQualifiedTypeName(); token = _lexer.GetNextToken(); if (token == TokenType.Comma) { assemblyName = _lexer.GetNextEmbeddedAssemblyName(); token = _lexer.GetNextToken(); } if (token != TokenType.CloseSqBracket) { throw new ArgumentException(); } return(new AssemblyQualifiedTypeName(typeName, assemblyName)); } else { throw new ArgumentException(); } }
// // Parses a typename. The typename may be optionally postpended with a "," followed by a legal assembly name. // private static TypeName ParseAssemblyQualifiedTypeName(String s) { if (string.IsNullOrEmpty(s)) { return(null); } // Desktop compat: a whitespace-only "typename" qualified by an assembly name throws an ArgumentException rather than // a TypeLoadException. int idx = 0; while (idx < s.Length && Char.IsWhiteSpace(s[idx])) { idx++; } if (idx < s.Length && s[idx] == ',') { throw new ArgumentException(); } try { TypeParser parser = new TypeParser(s); NonQualifiedTypeName typeName = parser.ParseNonQualifiedTypeName(); TokenType token = parser._lexer.GetNextToken(); if (token == TokenType.End) { return(typeName); } if (token == TokenType.Comma) { RuntimeAssemblyName assemblyName = parser._lexer.GetNextAssemblyName(); token = parser._lexer.Peek; if (token != TokenType.End) { throw new ArgumentException(); } return(new AssemblyQualifiedTypeName(typeName, assemblyName)); } throw new ArgumentException(); } catch (TypeLexer.IllegalEscapeSequenceException) { // Emulates a CLR4.5 bug that causes any string that contains an illegal escape sequence to be parsed as the empty string. return(ParseAssemblyQualifiedTypeName(String.Empty)); } }
// // Parses a type name without any assembly name qualification. // private NonQualifiedTypeName ParseNonQualifiedTypeName() { // Parse the named type or constructed generic type part first. NonQualifiedTypeName typeName = ParseNamedOrConstructedGenericTypeName(); // Iterate through any "has-element" qualifiers ([], &, *). for (;;) { TokenType token = _lexer.Peek; if (token == TokenType.End) { break; } if (token == TokenType.Asterisk) { _lexer.Skip(); typeName = new PointerTypeName(typeName); } else if (token == TokenType.Ampersand) { _lexer.Skip(); typeName = new ByRefTypeName(typeName); } else if (token == TokenType.OpenSqBracket) { _lexer.Skip(); token = _lexer.GetNextToken(); if (token == TokenType.Asterisk) { typeName = new MultiDimArrayTypeName(typeName, 1); token = _lexer.GetNextToken(); } else { int rank = 1; while (token == TokenType.Comma) { token = _lexer.GetNextToken(); rank++; } if (rank == 1) { typeName = new ArrayTypeName(typeName); } else { typeName = new MultiDimArrayTypeName(typeName, rank); } } if (token != TokenType.CloseSqBracket) { throw new ArgumentException(); } } else { break; } } return(typeName); }
public AssemblyQualifiedTypeName(NonQualifiedTypeName typeName, RuntimeAssemblyName assemblyName) { Debug.Assert(typeName != null); TypeName = typeName; AssemblyName = assemblyName; }