public static bool CompareForArrayTypeCompatibility(NamedTypeBase t1, NamedTypeBase t2) { if (t1.Name != t2.Name) { return(false); } if (t1.Namespace != t2.Namespace) { return(false); } if (t1.IsGeneric != t2.IsGeneric) { return(false); } if (t1.IsGeneric) { if (t1.GenericParameters.Count != t2.GenericParameters.Count) { return(false); } for (int i = 0; i < t1.GenericParameters.Count; i++) { if ((GenericTypeParameterBase)t1.GenericParameters[i] != (GenericTypeParameterBase)t2.GenericParameters[i]) { return(false); } } } return(true); }
public static bool IsFieldInitializedOnce(this IFieldSymbol field, NamedTypeBase sType, Dictionary <ISymbol, SemanticModel> models, LoggerProvider logprovider) { var type = sType as CSharpNamedType; if (type == null) { throw new ArgumentException(); } if (type.SourceSymbol.DeclaringSyntaxReferences == null) { logprovider.WriteToLog(string.Format("Cannot find declaring syntax references for symbol {0}", type.SourceSymbol.ToString())); return(false); } if (type.SourceSymbol.DeclaringSyntaxReferences.Count() > 1) { logprovider.WriteToLog(string.Format("There are more than 1 declaring references for symbol {0}", type.SourceSymbol.ToString())); return(false); } if (type.SourceSymbol.DeclaringSyntaxReferences.Count() < 1) { logprovider.WriteToLog(string.Format("There are less than 1 declaring references for symbol {0}", type.SourceSymbol.ToString())); return(false); } if (type.SourceSymbol.DeclaringSyntaxReferences[0].GetSyntax() == null) { logprovider.WriteToLog(string.Format("Cannnot get syntax for declaring syntax reference {0}", type.SourceSymbol.DeclaringSyntaxReferences[0].ToString())); return(false); } var ase = type.SourceSymbol.DeclaringSyntaxReferences[0].GetSyntax().DescendantNodes().Where(c => c.CSharpKind() == SyntaxKind.SimpleAssignmentExpression).ToList(); foreach (var a in ase) { var id = a.DescendantNodes().OfType <IdentifierNameSyntax>().ToList(); if (id.Count != 1) { return(false); } SemanticModel model = null; if (models.TryGetValue(field, out model) || models.TryGetValue(field.ContainingSymbol, out model)) { try { var s = model.GetSymbolInfo(id[0]); if (s.Symbol == null) { logprovider.WriteToLog(string.Format("Cannot find symbol for IdentifierNameSyntax {0}", id[0].ToString())); return(false); } if (s.Symbol.Name == field.Name) { return(true); } } //hack catch (Exception ex) { logprovider.WriteToLog(string.Format("Error when finding symbol for IdentifierNameSyntax {0}", id[0].ToString())); return(false); } } } return(false); }
public static MethodBase ToCSharpMethod(this IMethodSymbol methodSymbol, List <NamedTypeBase> types, SemanticModel model, NamedTypeBase parentType, LoggerProvider logprovider) { if (methodSymbol == null) { return(null); } INamedType drt = null; //hack if (methodSymbol.ReturnType.TypeKind != TypeKind.TypeParameter) { drt = types.FirstOrDefault(t => t == methodSymbol.ReturnType.ToCSharpNamedType(logprovider)); if (drt == null && !methodSymbol.ReturnsVoid) { logprovider.WriteToLog(string.Format("Cannot find type for {0} as the non-void declared return type of method {1}, creating empty type manually", methodSymbol.ReturnType.ToString(), methodSymbol.ToString())); types.Add(methodSymbol.ReturnType.ToCSharpNamedType(logprovider)); } } List <IMethodParameter> parameters = new List <IMethodParameter>(); foreach (var paramSymbol in methodSymbol.Parameters) { parameters.Add(paramSymbol.ToCSharpMethodParameter(types, logprovider)); } return(new CSharpMethod { IsAbstract = methodSymbol.IsAbstract, IsOverride = methodSymbol.IsOverride, IsStatic = methodSymbol.IsStatic, IsVirtual = methodSymbol.IsVirtual, Parent = parentType, Name = methodSymbol.Name, IsCtor = (methodSymbol.MethodKind == MethodKind.Constructor), Visibility = methodSymbol.DeclaredAccessibility.ToVisibilityModifierBase(logprovider), DeclaredReturnType = drt, Parameters = parameters, ActualReturnTypes = methodSymbol.GetActualReturnTypes(types, model), IsGeneric = methodSymbol.IsGenericMethod, SourceSymbol = methodSymbol, GenericParameters = CSharpModelBuilder.BuildGenericList(methodSymbol.TypeArguments) }); }