public override void VisitIdentifierName(IdentifierNameSyntax node) { string name = node.Identifier.Text; if (m_ClassInfoStack.Count > 0) { ClassInfo classInfo = m_ClassInfoStack.Peek(); SymbolInfo symbolInfo = m_Model.GetSymbolInfo(node); var sym = symbolInfo.Symbol; if (null != sym) { if (sym.Kind == SymbolKind.NamedType || sym.Kind == SymbolKind.Namespace) { string fullName = ClassInfo.GetFullName(sym); CodeBuilder.Append(fullName); if (sym.Kind == SymbolKind.NamedType) { var namedType = sym as INamedTypeSymbol; AddReferenceAndTryDeriveGenericTypeInstance(classInfo, namedType); } return; } else if (sym.Kind == SymbolKind.Field || sym.Kind == SymbolKind.Property || sym.Kind == SymbolKind.Event) { if (m_ObjectCreateStack.Count > 0) { ITypeSymbol symInfo = m_ObjectCreateStack.Peek(); if (null != symInfo) { var names = symInfo.GetMembers(name); if (names.Length > 0) { CodeBuilder.AppendFormat("{0}", name); return; } } } if (sym.ContainingType == classInfo.SemanticInfo || sym.ContainingType == classInfo.SemanticInfo.OriginalDefinition || classInfo.IsInherit(sym.ContainingType)) { if (sym.IsStatic) { CodeBuilder.AppendFormat("{0}.{1}", classInfo.Key, sym.Name); } else { CodeBuilder.AppendFormat("this.{0}", sym.Name); } return; } } else if (sym.Kind == SymbolKind.Method && sym.ContainingType == classInfo.SemanticInfo) { var msym = sym as IMethodSymbol; string manglingName = NameMangling(msym); var mi = new MethodInfo(); mi.Init(msym, node); if (node.Parent is InvocationExpressionSyntax) { if (sym.IsStatic) { CodeBuilder.AppendFormat("{0}.{1}", classInfo.Key, manglingName); } else { CodeBuilder.AppendFormat("this:{0}", manglingName); } } else { CodeBuilder.Append("(function("); string paramsString = string.Join(", ", mi.ParamNames.ToArray()); CodeBuilder.Append(paramsString); if (sym.IsStatic) { CodeBuilder.AppendFormat(") {0}{1}.{2}({3}); end)", msym.ReturnsVoid ? string.Empty : "return ", classInfo.Key, manglingName, paramsString); } else { CodeBuilder.AppendFormat(") {0}this:{1}({2}); end)", msym.ReturnsVoid ? string.Empty : "return ", manglingName, paramsString); } } return; } } else { if (m_ObjectCreateStack.Count > 0) { ITypeSymbol symInfo = m_ObjectCreateStack.Peek(); if (null != symInfo) { var names = symInfo.GetMembers(name); if (names.Length > 0) { CodeBuilder.AppendFormat("{0}", name); return; } } } else { ReportIllegalSymbol(node, symbolInfo); } } } CodeBuilder.Append(name); }