Beispiel #1
0
        public void Parse(string sourceFile, string[] includeDirs = null, string[] additionalOptions = null, bool msCompati = true)
        {
            var file = _EntityBinder.File(sourceFile);

            if (_TranslationUnits.ContainsKey(file))
            {
                return;
            }

            var ufile   = new CXUnsavedFile();
            var tu      = new CXTranslationUnit();
            var options = new List <string>(new string[] { "-std=c++14", "-ferror-limit=9999" });

            if (includeDirs != null)
            {
                foreach (var dir in includeDirs)
                {
                    options.Add(string.Concat("-I", dir, ""));
                }
            }

            if (additionalOptions != null)
            {
                options.AddRange(additionalOptions);
            }

            if (msCompati)
            {
                options.Add("-fms-extensions");
                options.Add("-fms-compatibility");
            }

            var erro = clang.parseTranslationUnit2(_Index, sourceFile, options.ToArray(), options.Count, out ufile, 0, 0, out tu);

            _CurrentTranslation             = new Translation(tu, file);
            _CurrentTranslation.Diagnostics = Diagnostic.CreateFrom(tu);
            _TranslationUnits[file]         = _CurrentTranslation;

            foreach (var d in _CurrentTranslation.Diagnostics)
            {
                _Output.AppendLine(d.ToString());
            }


            // 本当はここでエラーチェックが好ましい
            var cursor = clang.getTranslationUnitCursor(tu);


            clang.visitChildren(cursor, _CursorVisitor, new CXClientData());


            //foreach(var e in new List<Entity>(_CursorToEntity.Values)) {
            //	Console.WriteLine(e.FullName);
            //}

            // TODO: 削除する
            var kinds = new List <CXCursorKind>(_UsedKinds);

            kinds.Sort();
            foreach (var kind in kinds)
            {
                Console.WriteLine(kind);
            }
        }