/// <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)); //インタータイプ宣言の合成結果はアスペクトの記述順と逆になるので、構造の一致はテストできない }
private void Weave(object sender, RoutedEventArgs e) { //選択されたパスからファイルを取得 var targetPath = TargetPath.Text; var aspectPath = AspectPath.Text; // アスペクトファイルの解析 Weaver.AnalizeAspect(aspectPath); // アスペクトの合成処理実行 Weaver.Run(targetPath); }
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); }