Beispiel #1
0
        //------------------------------------------------------------
        // モジュールを追加する。
        public bool Add(ModuleContext aModuleContext)
        {
            // 同じパスのものが既に追加されていないかチェックしつつ追加する
            ISymbolNode node      = mRoot;
            IdentPath   identPath = aModuleContext.ModuleDecl.IdentifierPath;

            for (int i = 0; i < identPath.Count; ++i)
            {
                ISymbolNode nextNode = node.FindChildNode(identPath.At(i));
                if (i + 1 == identPath.Count)
                {     // 最後
                    if (nextNode != null)
                    { // 最後なのに存在している
                        setErrorInfo(aModuleContext, ErrorKind.NODE_NAME_IS_ALREADY_EXIST, node.GetIdentifier().Token);
                        return(false);
                    }
                    break;
                }

                if (nextNode == null)
                {// 存在しないようなので追加
                    NamespaceSymbolNode addNode = new NamespaceSymbolNode(node, identPath.At(i));
                    if (node.GetNodeKind() == SymbolNodeKind.Root)
                    {
                        ((RootSymbolNode)node).AddNode(addNode);
                    }
                    else
                    {
                        ((NamespaceSymbolNode)node).AddNode(addNode);
                    }
                    node = addNode;
                }
                else
                {// 既に存在している
                    node = nextNode;
                    if (node.GetNodeKind() != SymbolNodeKind.NameSpace)
                    {// 名前空間じゃないものとして存在する
                        setErrorInfo(aModuleContext, ErrorKind.NODE_NAME_IS_ALREADY_EXIST_AS_NOT_NAMESPACE, node.GetIdentifier().Token);
                        return(false);
                    }
                }
            }
            System.Diagnostics.Debug.Assert(node.GetNodeKind() == SymbolNodeKind.NameSpace);

            // Moduleノードを追加
            ((NamespaceSymbolNode)node).AddNode(new ModuleSymbolNode(node, aModuleContext));

            return(true);
        }
Beispiel #2
0
 //------------------------------------------------------------
 // コンストラクタ。
 public ExternalModuleDecl(IdentPath aPath, Kind aKind)
 {
     mIdentifierPath = aPath;
     mKind           = aKind;
 }
Beispiel #3
0
 //------------------------------------------------------------
 // ユーザー定義型として初期化。
 public TypePath(IdentPath aIP)
 {
     IdentPath = aIP;
 }
Beispiel #4
0
 //------------------------------------------------------------
 // コンストラクタ。
 public ModuleDecl(IdentPath aPath, bool aIsProtoType)
 {
     IdentifierPath = aPath;
     IsProtoType    = aIsProtoType;
 }
Beispiel #5
0
 //------------------------------------------------------------
 // コンストラクタ。
 public InheritInterface(IdentPath aTypeIdentPath, IdentPath aImplIdentPath)
 {
     TypeIdentPath = aTypeIdentPath;
     ImplIdentPath = aImplIdentPath;
 }