Пример #1
0
        public void Compile()
        {
            if (_compilation == null)
            {
                ImmutableModel coreModel = MetaInstance.MModel;
                string         text      = File.ReadAllText(_inputFilePath);
                var            tree      = MetaSyntaxTree.ParseText(text, path: _inputFilePath);

                BinderFlags binderFlags = BinderFlags.IgnoreAccessibility;
                if (_compileMetaModelCore)
                {
                    BinderFlags binderFlags2 = BinderFlags.IgnoreMetaLibraryDuplicatedTypes;
                    binderFlags = binderFlags.UnionWith(binderFlags2);
                }
                MetaCompilationOptions options = new MetaCompilationOptions(MetaLanguage.Instance, OutputKind.NetModule, deterministic: true, concurrentBuild: true,
                                                                            topLevelBinderFlags: binderFlags);
                //MetaCompilationOptions options = new MetaCompilationOptions(MetaLanguage.Instance, OutputKind.NetModule, deterministic: true, concurrentBuild: false);
                var compilation = MetaCompilation.
                                  Create("MetaModelCompilation").
                                  AddSyntaxTrees(tree).
                                  AddReferences(
                    ModelReference.CreateFromModel(coreModel)
                    ).
                                  WithOptions(options);
                Interlocked.CompareExchange(ref _compilation, compilation, null);
            }
            _compilation.ForceComplete();
        }
Пример #2
0
        private bool Test(int index)
        {
            bool           result            = false;
            string         inputFileName     = string.Format(@"..\..\InputFiles\xsd\Xsd{0:00}.Hello.xsd", index);
            string         expectedFileName  = string.Format(@"..\..\ExpectedFiles\soal\Xsd{0:00}.soal", index);
            string         outputFileName    = string.Format(@"..\..\OutputFiles\soal\Xsd{0:00}.Hello.soal", index);
            string         outputLogFileName = string.Format(@"..\..\OutputFiles\soal\Xsd{0:00}.Hello.log", index);
            string         outputDirectory   = string.Format(@"..\..\OutputFiles\soal", index);
            DiagnosticBag  diagnostics       = new DiagnosticBag();
            ImmutableModel model             = SoalImporter.Import(inputFileName, diagnostics);

            using (StreamWriter writer = new StreamWriter(outputLogFileName))
            {
                foreach (var msg in diagnostics.AsEnumerable())
                {
                    writer.WriteLine(msg);
                }
            }
            Assert.IsFalse(diagnostics.HasAnyErrors());
            Directory.CreateDirectory(outputDirectory);
            SoalPrinter printer    = new SoalPrinter(model.Symbols);
            string      outputSoal = printer.Generate();

            File.WriteAllText(outputFileName, outputSoal);
            string expectedSoal = null;

            using (StreamReader reader = new StreamReader(expectedFileName))
            {
                expectedSoal = reader.ReadToEnd();
            }
            Assert.AreEqual(expectedSoal, outputSoal);
            return(result);
        }
Пример #3
0
 public EcoreToMetaConverter(ImmutableModel ecore)
 {
     _ecore       = ecore;
     _meta        = new MutableModel();
     _factory     = new MetaFactory(_meta);
     _diagnostics = new DiagnosticBag();
     _map         = new Dictionary <ImmutableObject, MutableObject>();
 }
Пример #4
0
        /// <summary>
        /// Create metadata reference from a MetaDslx model.
        /// </summary>
        /// <param name="model">A MetaDslx model.</param>
        /// <exception cref="ArgumentNullException"><paramref name="model"/> is null.</exception>
        public static ModelReference CreateFromModel(ImmutableModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            return(new ModelReference(ModelMetadata.CreateFromModel(model), MetadataReferenceProperties.Module, DocumentationProvider.Default, null, null));
        }
Пример #5
0
 public SoalGenerator(ImmutableModel model, string outputDirectory, DiagnosticBag diagnostics, string fileName)
 {
     this.FileName        = fileName;
     this.OutputDirectory = outputDirectory;
     this.diagnostics     = diagnostics;
     this.SeparateXsdWsdl = false;
     this.SingleFileWsdl  = false;
     this.modelBuilder    = model.ToMutable(true);
 }
Пример #6
0
        /// <summary>
        /// Create metadata module from a MetaDslx model.
        /// </summary>
        /// <param name="model">A MetaDslx model.</param>
        /// <exception cref="ArgumentNullException"><paramref name="model"/> is null.</exception>
        public static ModelMetadata CreateFromModel(ImmutableModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            return(new ModelMetadata(model));
        }
        public ImmutableModel ReadModel(IEnumerable <string> umlCode, ImmutableModel classDiagram, out ImmutableArray <Diagnostic> diagnostics)
        {
            if (umlCode == null)
            {
                throw new ArgumentNullException(nameof(umlCode));
            }
            var fileAndCode = umlCode.Select <string, (string, string)>((uc, index) => ("code" + index, uc));

            return(this.ReadModel(fileAndCode, classDiagram, out diagnostics));
        }
        public ImmutableModel ReadModelFromFile(IEnumerable <string> filePath, ImmutableModel classDiagram, out ImmutableArray <Diagnostic> diagnostics)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException(nameof(filePath));
            }
            var fileAndCode = filePath.Select(fp => (fp, File.ReadAllText(fp)));

            return(this.ReadModel(fileAndCode, classDiagram, out diagnostics));
        }
Пример #9
0
 public SoalGenerator(ImmutableModel model, ImmutableDictionary <IMetaSymbol, Symbol> symbolMap, string outputDirectory, DiagnosticBag diagnostics, string fileName)
 {
     this.FileName        = fileName;
     this.OutputDirectory = outputDirectory;
     this.diagnostics     = diagnostics;
     this.SeparateXsdWsdl = false;
     this.SingleFileWsdl  = false;
     this.modelBuilder    = model.ToMutable(true);
     _symbolMap           = symbolMap;
 }
Пример #10
0
        private bool Test(int index)
        {
            bool   result               = false;
            string inputFileName        = string.Format(@"..\..\InputFiles\soal\Wsdl{0:00}.soal", index);
            string expectedXsdFileName  = string.Format(@"..\..\ExpectedFiles\xsd\Wsdl{0:00}.Hello.xsd", index);
            string outputXsdFileName    = string.Format(@"..\..\OutputFiles\xsd\Wsdl{0:00}.Hello.xsd", index);
            string expectedWsdlFileName = string.Format(@"..\..\ExpectedFiles\wsdl\Wsdl{0:00}.Hello.wsdl", index);
            string outputWsdlFileName   = string.Format(@"..\..\OutputFiles\wsdl\Wsdl{0:00}.Hello.wsdl", index);
            string outputDirectory      = string.Format(@"..\..\OutputFiles");
            string inputSoal            = null;

            using (StreamReader reader = new StreamReader(inputFileName))
            {
                inputSoal = reader.ReadToEnd();
            }
            SoalSyntaxTree    syntaxTree    = SoalSyntaxTree.ParseText(inputSoal);
            MetadataReference soalReference = MetadataReference.CreateFromModel(SoalInstance.Model);
            SoalCompilation   compilation   = SoalCompilation.Create("SoalTest").AddReferences(soalReference).AddSyntaxTrees(syntaxTree);
            ImmutableModel    model         = compilation.Model;

            Assert.IsFalse(compilation.GetDiagnostics().Any(d => d.Severity == Compiler.Diagnostics.DiagnosticSeverity.Error));
            DiagnosticBag generatorDiagnostics = new DiagnosticBag();
            SoalGenerator generator            = new SoalGenerator(model, outputDirectory, generatorDiagnostics, inputFileName);

            generator.SeparateXsdWsdl = true;
            generator.SingleFileWsdl  = false;
            generator.Generate();
            string expectedXsd = null;

            using (StreamReader reader = new StreamReader(expectedXsdFileName))
            {
                expectedXsd = reader.ReadToEnd();
            }
            string outputXsd = null;

            using (StreamReader reader = new StreamReader(outputXsdFileName))
            {
                outputXsd = reader.ReadToEnd();
            }
            Assert.AreEqual(expectedXsd, outputXsd);
            string expectedWsdl = null;

            using (StreamReader reader = new StreamReader(expectedWsdlFileName))
            {
                expectedWsdl = reader.ReadToEnd();
            }
            string outputWsdl = null;

            using (StreamReader reader = new StreamReader(outputWsdlFileName))
            {
                outputWsdl = reader.ReadToEnd();
            }
            Assert.AreEqual(expectedWsdl, outputWsdl);
            return(result);
        }
Пример #11
0
        private bool Test(int index)
        {
            bool   result            = false;
            string inputFileName     = string.Format(@"..\..\InputFiles\wsdl\Wsdl{0:00}.Hello.wsdl", index);
            string expectedFileName  = string.Format(@"..\..\ExpectedFiles\soal\Wsdl{0:00}.soal", index);
            string outputFileName    = string.Format(@"..\..\OutputFiles\soal\Wsdl{0:00}.Hello.soal", index);
            string outputLogFileName = string.Format(@"..\..\OutputFiles\soal\Wsdl{0:00}.Hello.log", index);
            string outputDirectory   = string.Format(@"..\..\OutputFiles\soal", index);

            Directory.CreateDirectory(outputDirectory);

            DiagnosticBag  diagnostics = new DiagnosticBag();
            ImmutableModel model       = SoalImporter.Import(inputFileName, diagnostics);

            using (StreamWriter writer = new StreamWriter(outputLogFileName))
            {
                foreach (var msg in diagnostics.AsEnumerable())
                {
                    writer.WriteLine(msg);
                }
            }
            Assert.IsFalse(diagnostics.HasAnyErrors());
            Directory.CreateDirectory(outputDirectory);
            SoalPrinter printer    = new SoalPrinter(model.Symbols);
            string      outputSoal = printer.Generate();

            File.WriteAllText(outputFileName, outputSoal);
            string expectedSoal = null;

            using (StreamReader reader = new StreamReader(expectedFileName))
            {
                expectedSoal = reader.ReadToEnd();
            }
            int firstDiff = -1;
            int line      = 1;
            int column    = 1;
            int max       = Math.Max(expectedSoal.Length, outputSoal.Length);

            for (int i = 0; i < max; i++)
            {
                if (expectedSoal[i] != outputSoal[i])
                {
                    firstDiff = i;
                    break;
                }
                ++column;
                if (expectedSoal[i] == '\n')
                {
                    ++line;
                    column = 1;
                }
            }
            Assert.AreEqual(expectedSoal, outputSoal);
            return(result);
        }
Пример #12
0
        protected void loadModel(string fileName)
        {
            UmlDescriptor.Initialize();
            var umlSerializer = new WhiteStarUmlSerializer();
            var model         = umlSerializer.ReadModelFromFile(fileName, out var diagnostics);

            if (this.model != null && this.model.Name.Equals(model.Name))
            {
                return;
            }
            this.model = model;
        }
Пример #13
0
        private bool Test(int index)
        {
            bool   result           = false;
            string inputFileName    = string.Format(@"..\..\InputFiles\soal\Xsd{0:00}.soal", index);
            string expectedFileName = string.Format(@"..\..\ExpectedFiles\xsd\Xsd{0:00}.Hello.xsd", index);
            string outputFileName   = string.Format(@"..\..\OutputFiles\xsd\Xsd{0:00}.Hello.xsd", index);
            string outputDirectory  = string.Format(@"..\..\OutputFiles");
            string inputSoal        = null;

            using (StreamReader reader = new StreamReader(inputFileName))
            {
                inputSoal = reader.ReadToEnd();
            }
            SoalSyntaxTree         syntaxTree    = SoalSyntaxTree.ParseText(inputSoal);
            ModelReference         soalReference = ModelReference.CreateFromModel(SoalInstance.Model);
            BinderFlags            binderFlags   = BinderFlags.IgnoreAccessibility;
            SoalCompilationOptions options       = new SoalCompilationOptions(SoalLanguage.Instance, OutputKind.NetModule, topLevelBinderFlags: binderFlags);
            SoalCompilation        compilation   = SoalCompilation.Create("SoalTest").AddReferences(soalReference).AddSyntaxTrees(syntaxTree).WithOptions(options);

            compilation.ForceComplete();
            ImmutableModel model = compilation.Model;

            Assert.IsFalse(compilation.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error));

            DiagnosticBag generatorDiagnostics = new DiagnosticBag();
            SoalGenerator generator            = new SoalGenerator(model, compilation.BuildModelObjectToSymbolMap(), outputDirectory, generatorDiagnostics, inputFileName);

            generator.SeparateXsdWsdl = true;
            generator.SingleFileWsdl  = false;
            generator.Generate();

            Assert.IsFalse(generatorDiagnostics.AsEnumerable().Any(d => d.Severity == DiagnosticSeverity.Error));

            string expectedXsd = null;

            using (StreamReader reader = new StreamReader(expectedFileName))
            {
                expectedXsd = reader.ReadToEnd();
            }
            string outputXsd = null;

            using (StreamReader reader = new StreamReader(outputFileName))
            {
                outputXsd = reader.ReadToEnd();
            }
            Assert.AreEqual(expectedXsd, outputXsd);
            return(result);
        }
Пример #14
0
 public static ImmutableModel ToMetaModel(ImmutableModel ecoreModel)
 {
     return(new EcoreToMetaConverter(ecoreModel).Convert());
 }
Пример #15
0
 // creates a copy
 private ModelMetadata(ModelMetadata metadata)
     : base(isImageOwner: false, id: metadata.Id)
 {
     _model = metadata.Model;
 }
Пример #16
0
 private ModelMetadata(ImmutableModel model)
     : base(isImageOwner: true, id: MetadataId.CreateNewId())
 {
     _model = model;
 }
Пример #17
0
        static void Main(string[] args)
        {
            string fileName        = null;
            string outputDirectory = null;
            bool   separateXsdWsdl = false;
            bool   singleFileWsdl  = false;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].StartsWith("-"))
                {
                    if (args[i] == "-separateXsdWsdl")
                    {
                        separateXsdWsdl = true;
                    }
                    else if (args[i] == "-singleFileWsdl")
                    {
                        singleFileWsdl = true;
                    }
                    else if (i + 1 < args.Length)
                    {
                        if (args[i] == "-o")
                        {
                            outputDirectory = args[++i];
                        }
                        else
                        {
                            Console.WriteLine("Unknown option: '" + args[i] + "'");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Unknown option: '" + args[i] + "'");
                    }
                }
                else
                {
                    fileName = args[i];
                }
            }
            if (fileName == null)
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("  Soal.exe [options] [input.soal]");
                Console.WriteLine("Options:");
                Console.WriteLine("  -o [dir]: output directory");
                Console.WriteLine("  -separateXsdWsdl: separate XSD and WSDL files into different directories");
                Console.WriteLine("  -singleFileWsdl: include XSD code into the WSDL");
                return;
            }
            if (outputDirectory == null)
            {
                outputDirectory = Directory.GetCurrentDirectory();
            }
            if (!File.Exists(fileName))
            {
                Console.WriteLine("Could not find file: " + fileName);
                return;
            }
            if (singleFileWsdl && separateXsdWsdl)
            {
                Console.WriteLine("Warning: conflicting options '-separateXsdWsdl' and '-singleFileWsdl'. '-singleFileWsdl' will be used.");
            }
            string source;

            using (StreamReader reader = new StreamReader(fileName))
            {
                source = reader.ReadToEnd();
            }
            SoalSyntaxTree         syntaxTree    = SoalSyntaxTree.ParseText(source);
            ModelReference         soalReference = ModelReference.CreateFromModel(SoalInstance.Model);
            BinderFlags            binderFlags   = BinderFlags.IgnoreAccessibility;
            SoalCompilationOptions options       = new SoalCompilationOptions(SoalLanguage.Instance, OutputKind.NetModule, topLevelBinderFlags: binderFlags, concurrentBuild: false);
            SoalCompilation        compilation   = SoalCompilation.Create("SoalTest").AddReferences(soalReference).AddSyntaxTrees(syntaxTree).WithOptions(options);

            compilation.ForceComplete();
            ImmutableModel model = compilation.Model;
            DiagnosticBag  generatorDiagnostics = new DiagnosticBag();

            if (!compilation.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error))
            {
                SoalGenerator generator = new SoalGenerator(model, compilation.BuildModelObjectToSymbolMap(), outputDirectory, generatorDiagnostics, fileName);
                generator.SeparateXsdWsdl = separateXsdWsdl;
                generator.SingleFileWsdl  = singleFileWsdl;
                generator.Generate();
                SoalPrinter printer = new SoalPrinter(model.Symbols);
                using (StreamWriter writer = new StreamWriter(fileName + "0"))
                {
                    writer.WriteLine(printer.Generate());
                }
            }
            DiagnosticFormatter formatter = new DiagnosticFormatter();

            foreach (var diagnostic in compilation.GetDiagnostics())
            {
                string msg = formatter.Format(diagnostic);
                Console.WriteLine(msg);
            }
            foreach (var diagnostic in generatorDiagnostics.AsEnumerable())
            {
                string msg = formatter.Format(diagnostic);
                Console.WriteLine(msg);
            }
        }
Пример #18
0
 static void Main(string[] args)
 {
     try
     {
         string inputFileName  = null;
         string outputFileName = null;
         for (int i = 0; i < args.Length; i++)
         {
             if (args[i].StartsWith("-"))
             {
                 if (i + 1 < args.Length)
                 {
                     if (args[i] == "-o")
                     {
                         outputFileName = args[++i];
                     }
                     else
                     {
                         Console.WriteLine("Unknown option: '" + args[i] + "'");
                     }
                 }
                 else
                 {
                     Console.WriteLine("Unknown option: '" + args[i] + "'");
                 }
             }
             else
             {
                 inputFileName = args[i];
             }
         }
         if (inputFileName == null)
         {
             Console.WriteLine("Usage:");
             Console.WriteLine("  SoalImport.exe [options] [input.wsdl or input.xsd]");
             Console.WriteLine("Options:");
             Console.WriteLine("  -o [output.soal]: output SOAL file");
             return;
         }
         if (outputFileName == null)
         {
             outputFileName = Path.ChangeExtension(inputFileName, ".soal");
         }
         if (!File.Exists(inputFileName))
         {
             Console.WriteLine("Could not find file: " + inputFileName);
             return;
         }
         DiagnosticBag  importDiagnostics = new DiagnosticBag();
         ImmutableModel model             = SoalImporter.Import(inputFileName, importDiagnostics);
         foreach (var msg in importDiagnostics.AsEnumerable())
         {
             Console.WriteLine(msg);
         }
         //if (!ModelCompilerContext.Current.Diagnostics.HasErrors())
         {
             SoalPrinter printer = new SoalPrinter(model.Symbols);
             using (StreamWriter writer = new StreamWriter(outputFileName))
             {
                 writer.WriteLine(printer.Generate());
             }
         }
     }
     catch (System.Exception ex)
     {
         Console.WriteLine(ex);
     }
 }