Пример #1
0
        public void 例外ポイントカットを作成してcatch節の中にコードを追加する()
        {
            // オリジナルのソースコードのUCOとアスペクト合成後に期待されるソースコードのUCOを生成する
            var model  = UnifiedGenerators.GenerateProgramFromFile(_sourcePath);
            var actual = UnifiedGenerators.GenerateProgramFromFile(_expectationSourcePath);

            var pointcut = new Pointcut();

            pointcut.SetTarget("*");
            pointcut.SetTarget("Exception");


            // オリジナルのUCOに対して、アスペクトを合成する
            CodeProcessorProvider.WeavingBefore("exception", model, pointcut,
                                                UcoGenerator.CreateAdvice("Java", "System.out.println(\"test\");"));

            model.Normalize();

            var gen = UnifiedGenerators.GetCodeGeneratorByExtension(".java");

            Console.WriteLine(gen.Generate(model));
            Console.WriteLine(gen.Generate(actual));

            // 両者の構造を比較する
            Assert.That(model, Is.EqualTo(actual).Using(StructuralEqualityComparer.Instance));
        }
Пример #2
0
        private void WeaveForOne(object sender, RoutedEventArgs e)
        {
            //選択されたパスからファイルを取得
            var targetPath = TargetPath.Text;
            var aspectPath = AspectPath.Text;

            //アスペクト情報を持つオブジェクトを生成する
            var aspect = new ANTLRFileStream(aspectPath);
            var lexer  = new UniAspectLexer(aspect);
            var tokens = new CommonTokenStream(lexer);
            var parser = new UniAspectParser(tokens);

            //アスペクトファイルを解析してASTを生成する
            var result = parser.aspect();
            var ast    = (CommonTree)result.Tree;

            //ASTを走査してパース結果をアスペクトオブジェクトとしてvisitor内に格納する
            var visitor = new AstVisitor();

            visitor.Visit(ast, 0, null);

            //対象ファイルの拡張子を取得
            var fileExtension = Path.GetExtension(targetPath);

            //対象言語のソースコードでない場合は次の対象へ進む
            string langType;

            if (fileExtension == null ||
                !TargetLanguage.TryGetValue(fileExtension, out langType))
            {
                WeavedSourceArea.Text = "指定のプログラミング言語には対応していません";
                return;
            }

            var code = File.ReadAllText(targetPath, XEncoding.SJIS);
            var gen  =
                UnifiedGenerators.GetProgramGeneratorByExtension(
                    fileExtension);
            var model = gen.Generate(code);

            Weaver.AnalizeAspect(aspectPath);
            //アスペクトの合成を行う
            Weaver.Weave(langType, model);

            //とりえあず標準出力に表示;
            var codeGen = UnifiedGenerators.GetCodeGeneratorByExtension(fileExtension);

            WeavedSourceArea.Text = codeGen.Generate(model);
        }
Пример #3
0
        // アスペクトの合成処理を実行します
        // このメソッドはすべてのファイルに対してWeave()メソッドを呼び出す処理を行い、
        // 実際の合成処理はWeave()メソッドが行います
        public static void Run(string directoryPath)
        {
            //指定されたパス以下にあるディレクトリをすべてoutput以下にコピーします
            var workPath    = CleanOutputAndGetOutputPath();
            var directories = Directory.EnumerateDirectories(
                directoryPath, "*", SearchOption.AllDirectories);

            foreach (var dir in directories)
            {
                var newDir = dir.Replace(directoryPath, workPath);
                //WeavedSourceArea.Text += newDir;
                Directory.CreateDirectory(newDir);
            }

            //指定されたパス以下にあるソースコードのパスをすべて取得します
            var targetFiles = Collect(directoryPath);

            foreach (var file in targetFiles)
            {
                var newPath = file.Replace(directoryPath, workPath);

                // 対象ファイルの統合コードオブジェクトを生成する
                var gen = UnifiedGenerators.GetProgramGeneratorByExtension(Path.GetExtension(file));
                if (gen == null)
                {
                    File.Copy(file, newPath);
                    continue;
                }
                var model = gen.GenerateFromFile(file);

                //アスペクトの合成を行う
                Weave(ExtenstionToLanguageName(Path.GetExtension(file)), model);
                // 結果のファイル出力
                File.WriteAllText(newPath, UnifiedGenerators.GetCodeGeneratorByExtension(Path.GetExtension(file)).Generate(model));
            }
        }