/// <summary> /// Java言語向けにアスペクトが正しく合成されるかどうかをテストします /// </summary> /// <param name="aspectFile">入力アスペクトファイル名</param> /// <param name="expectationFile">アスペクト合成後の期待値ファイル名</param> public void AssertCorrectWeavingForJava(string aspectFile, string expectationFile) { //アスペクトモデルの作成 var aspectPath = FixtureUtil.GetAspectPath(aspectFile); Weaver.AnalizeAspect(aspectPath); //アスペクトの合成処理 Weaver.Weave("Java", _javaModel); //期待されるモデルの作成 var filePath = FixtureUtil.GetAspectExpectationPath(expectationFile); var expectation = UnifiedGenerators.GenerateProgramFromFile(filePath); //for debug var gen = new JavaCodeGenerator(); Console.Write(gen.Generate(_javaModel)); //モデル内のブロック数が1増えているかどうか Assert.That( _amountOfBlockInJava + 1, Is.EqualTo(_javaModel.Descendants <UnifiedBlock>().Count())); //構造が一致しているかどうか Assert.That( _javaModel, Is.EqualTo(expectation).Using(StructuralEqualityComparer.Instance)); }
public void JavaScript言語にインタータイプ宣言が正しく合成される() { //アスペクトモデルの作成 var aspectPath = FixtureUtil.GetAspectPath("intertype.apt"); Weaver.AnalizeAspect(aspectPath); //アスペクトの合成処理 Weaver.Weave("JavaScript", _javaScriptModel); //期待されるモデルの作成 var filePath = FixtureUtil.GetAspectExpectationPath("intertype.js"); var expectation = UnifiedGenerators.GenerateProgramFromFile(filePath); var amountOfMethodInExpectation = expectation.Descendants <UnifiedFunctionDefinition>().Count(); var amountOfMethodInJavaScript = _javaScriptModel.Descendants <UnifiedFunctionDefinition>().Count(); //モデル内のメソッド数が1増えているかどうか Assert.That( amountOfMethodInExpectation, Is.EqualTo(amountOfMethodInJavaScript)); //インタータイプ宣言の合成結果はアスペクトの記述順と逆になるので、構造の一致はテストできない }
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)); }
// 与えられたC#のコードを共通コードオブジェクトとして生成します private static UnifiedBlock CreateAdviceForCSharp(string code) { // 1つのメソッドを持つクラスとして統合コードオブジェクトを生成するために、 // そのメソッドが、与えられたコード断片を内部持つようにコードを補完します code = "public class C { public int M() {" + code + "}}"; var gen = UnifiedGenerators.GetProgramGeneratorByExtension(".cs"); var model = gen.Generate(code); var block = model.Descendants <UnifiedFunctionDefinition>().First().Body; return(block); }
public void Setup() { //Java言語のモデルを作成 _javaModel = UnifiedGenerators.GenerateProgramFromFile(JavaCodePath); _amountOfBlockInJava = _javaModel.Descendants <UnifiedBlock>().Count(); //JavaScript言語のモデルを作成 _javaScriptModel = UnifiedGenerators.GenerateProgramFromFile(JavaScriptCodePath); _amountOfBlockInJavaScript = _javaScriptModel.Descendants <UnifiedBlock>().Count(); }
// [TestCase("Java", ".java", "System.out.println(\"Inserted after.\");")] // [TestCase("JavaScript", ".js", "Console.log(\"Inserted after.\");")] // [TestCase("C", ".c", "printf(\"Inserted after.\");")] // [TestCase("CSharp", ".cs", "Console.WriteLine(\"Inserted after.\");")] // [TestCase("Python", ".py", "print \"Inserted after.\"")] public void SetAfterが正しく動作することを検証します(string language, string ext, string code) { var model = UnifiedGenerators.GenerateProgramFromFile( FixtureUtil.GetInputPath("Aspect", "Set", "Fibonacci" + ext)); var actual = UnifiedGenerators.GenerateProgramFromFile( FixtureUtil.GetInputPath("Aspect", "Set", "Fibonacci_expectation_after" + ext)); Set.InsertAtAfterSetByName( model, "fibonacci", UcoGenerator.CreateAdvice(language, code)); Assert.That(model, Is.EqualTo(actual).Using(StructuralEqualityComparer.Instance)); }
public void WeavingAtBeforeCallAll() { var model = UnifiedGenerators.GenerateProgramFromFile(_studentPath); var actual = UnifiedGenerators.GenerateProgramFromFile(FixtureUtil.GetAopExpectationPath("Java", "Student_callBefore.java")); Call.InsertAtBeforeCallAll( model, UcoGenerator.CreateAdvice("Java", "Console.Write();")); Assert.That( model, Is.EqualTo(actual).Using(StructuralEqualityComparer.Instance)); }
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); }
// [TestCase("Python", ".py", "print \"Inserted after.\"")] public void ExecutionAfterが正しく動作することを検証します(string language, string ext, string code) { var model = UnifiedGenerators.GenerateProgramFromFile( FixtureUtil.GetInputPath("Aspect", "Execution", "Fibonacci" + ext)); var actual = UnifiedGenerators.GenerateProgramFromFile( FixtureUtil.GetInputPath("Aspect", "Execution", "Fibonacci_expectation_after" + ext)); var pointcut = new Pointcut(); pointcut.SetTarget("*"); pointcut.SetTarget("fibonacci"); CodeProcessorProvider.WeavingAfter("execution", model, pointcut, UcoGenerator.CreateAdvice(language, code)); Assert.That(model, Is.EqualTo(actual).Using(StructuralEqualityComparer.Instance)); }
public static Dictionary <string, int> Measure( string filePath, Func <UnifiedElement, IEnumerable <UnifiedElement> > getTargetElementsFunc) { try { var counts = new Dictionary <string, int>(); var prog = UnifiedGenerators.GenerateProgramFromFile(filePath); if (prog == null) { return(new Dictionary <string, int>()); } InitializeCounter(prog, counts); CountElements(getTargetElementsFunc(prog), counts); return(counts); } catch { return(new Dictionary <string, int>()); } }
// アスペクトの合成処理を実行します // このメソッドはすべてのファイルに対して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)); } }
//指定されたパスのファイルを読み込んで共通コードオブジェクトに変換します public UnifiedProgram CreateProgramFromCode(string extension, string code) { var gen = UnifiedGenerators.GetProgramGeneratorByExtension(extension); return(gen.Generate(code)); }