示例#1
0
        public virtual string GetDeclName(Declaration declaration, TypePrintScopeKind scope)
        {
            switch (scope)
            {
            case TypePrintScopeKind.Local:
                return(PrintLogicalNames ? declaration.LogicalOriginalName
                    : declaration.OriginalName);

            case TypePrintScopeKind.Qualified:
                if (declaration.Namespace is Class)
                {
                    return($"{declaration.Namespace.Visit(this)}::{declaration.OriginalName}");
                }
                return(PrintLogicalNames ? declaration.QualifiedLogicalOriginalName
                    : declaration.QualifiedOriginalName);

            case TypePrintScopeKind.GlobalQualified:
                if (declaration.Namespace is Class)
                {
                    return($"{declaration.Namespace.Visit(this)}::{declaration.OriginalName}");
                }
                var qualifier = PrintFlavorKind == CppTypePrintFlavorKind.Cpp ? "::" : string.Empty;
                return(qualifier + GetDeclName(declaration, TypePrintScopeKind.Qualified));
            }

            throw new NotSupportedException();
        }
示例#2
0
        public static string GetCIdentifier(BindingContext context, Declaration decl,
                                            TypePrintScopeKind scope = TypePrintScopeKind.Qualified)
        {
            var cTypePrinter = new CppTypePrinter(context)
            {
                PrintFlavorKind = CppTypePrintFlavorKind.C,
                ScopeKind       = TypePrintScopeKind.Local
            };

            var functionName = cTypePrinter.VisitDeclaration(decl).ToString();

            if (scope == TypePrintScopeKind.Local)
            {
                return(functionName);
            }

            cTypePrinter.ScopeKind = scope;
            var qualifiedParentName = cTypePrinter.VisitDeclaration(decl.Namespace).ToString();

            // HACK: CppTypePrinter code calls into decl.QualifiedName, which does not take into
            // account language flavor, that code needs to be reworked. For now, hack around it.
            qualifiedParentName = qualifiedParentName.Replace("::", "_");

            return($"{qualifiedParentName}_{functionName}");
        }
示例#3
0
        public override TypePrinterResult GetDeclName(Declaration declaration, TypePrintScopeKind scope)
        {
            var result = base.GetDeclName(declaration, scope);

            result.Type = result.Type.Replace("::", NamespaceSeparator);
            return(result);
        }
示例#4
0
        public TypePrinterResult GetDeclName(Declaration declaration,
                                             TypePrintScopeKind scope)
        {
            switch (scope)
            {
            case TypePrintScopeKind.Local:
            {
                if (ContextKind == TypePrinterContextKind.Managed)
                {
                    return(PrintLogicalNames ? declaration.LogicalName : declaration.Name);
                }

                return(PrintLogicalNames ? declaration.LogicalOriginalName
                    : declaration.OriginalName);
            }

            case TypePrintScopeKind.Qualified:
            {
                if (ContextKind == TypePrinterContextKind.Managed)
                {
                    var outputNamespace = declaration.TranslationUnit?.Module?.OutputNamespace;
                    if (!string.IsNullOrEmpty(outputNamespace))
                    {
                        return($"{outputNamespace}::{declaration.QualifiedName}");
                    }

                    return(declaration.QualifiedName);
                }

                if (declaration.Namespace is Class)
                {
                    return($"{declaration.Namespace.Visit(this)}::{declaration.OriginalName}");
                }

                return(PrintLogicalNames ? declaration.QualifiedLogicalOriginalName
                    : declaration.QualifiedOriginalName);
            }

            case TypePrintScopeKind.GlobalQualified:
            {
                var name = (ContextKind == TypePrinterContextKind.Managed) ?
                           declaration.Name : declaration.OriginalName;

                if (declaration.Namespace is Class)
                {
                    return($"{declaration.Namespace.Visit(this)}::{name}");
                }

                var qualifier = PrintFlavorKind == CppTypePrintFlavorKind.Cpp ? "::" : string.Empty;
                return(qualifier + GetDeclName(declaration, TypePrintScopeKind.Qualified));
            }
            }

            throw new NotSupportedException();
        }
示例#5
0
        public virtual TypePrinterResult GetDeclName(Declaration declaration,
                                                     TypePrintScopeKind scope)
        {
            switch (scope)
            {
            case TypePrintScopeKind.Local:
            {
                if (ContextKind == TypePrinterContextKind.Managed)
                {
                    return(PrintLogicalNames ? declaration.LogicalName : declaration.Name);
                }

                if (PrefixSpecialFunctions)
                {
                    if (declaration is Function {
                            IsOperator : true
                        } function)
                    {
                        return($"operator_{function.OperatorKind}");
                    }
                }

                return(PrintLogicalNames ? declaration.LogicalOriginalName
                            : declaration.OriginalName);
            }

            case TypePrintScopeKind.Qualified:
            {
                if (ContextKind == TypePrinterContextKind.Managed)
                {
                    var outputNamespace = GlobalNamespace(declaration);
                    if (!string.IsNullOrEmpty(outputNamespace))
                    {
                        return($"{outputNamespace}{NamespaceSeparator}{declaration.QualifiedName}");
                    }

                    return(declaration.QualifiedName);
                }

                if (declaration.Namespace is Class)
                {
                    var  declName  = GetDeclName(declaration, TypePrintScopeKind.Local);
                    bool printTags = PrintTags;
                    PrintTags = false;
                    TypePrinterResult declContext = declaration.Namespace.Visit(this);
                    PrintTags = printTags;
                    return($"{declContext}{NamespaceSeparator}{declName}");
                }

                return(PrintLogicalNames ? declaration.QualifiedLogicalOriginalName
                            : declaration.QualifiedOriginalName);
            }

            case TypePrintScopeKind.GlobalQualified:
            {
                var name = (ContextKind == TypePrinterContextKind.Managed) ?
                           declaration.Name : declaration.OriginalName;

                if (declaration.Namespace is Class)
                {
                    return($"{declaration.Namespace.Visit(this)}{NamespaceSeparator}{name}");
                }

                var qualifier = HasGlobalNamespacePrefix ? NamespaceSeparator : string.Empty;
                return(qualifier + GetDeclName(declaration, TypePrintScopeKind.Qualified));
            }
            }

            throw new NotSupportedException();
        }
示例#6
0
 public void PushScope(TypePrintScopeKind kind) => scopeKinds.Push(kind);