Files
Dave Friedel 5439aeb081 Resolved build errors
1. Fixed constructor calls in AstTransformer.cs by adding missing nestedTypes parameter
  2. Fixed constructor calls in AstJsonSerializer.cs by adding logic to deserialize nestedTypes
  3. Fixed constructor calls in AstBuilder.cs by adding empty nestedTypes lists and correct parameters
  4. Fixed test files by updating ClassDeclaration constructors with proper parameters
2025-07-23 05:24:18 -04:00

227 lines
7.8 KiB
C#

using MarketAlly.IronJava.Core;
using MarketAlly.IronJava.Core.AST;
using MarketAlly.IronJava.Core.AST.Nodes;
using MarketAlly.IronJava.Core.AST.Visitors;
using Xunit;
namespace MarketAlly.IronJava.Tests
{
/// <summary>
/// Demonstrates Phase 2 functionality with our typed AST.
/// </summary>
public class Phase2DemoTests
{
[Fact]
public void DemonstratesTypedASTStructure()
{
// Create a simple compilation unit programmatically
var location = new SourceRange(
new SourceLocation(1, 1, 0, 0),
new SourceLocation(1, 1, 0, 0)
);
// Create a class with a main method
var mainMethod = new MethodDeclaration(
location,
"main",
Modifiers.Public | Modifiers.Static,
new List<Annotation>(),
new PrimitiveType(location, PrimitiveTypeKind.Void),
new List<TypeParameter>(),
new List<Parameter>
{
new Parameter(
location,
new ArrayType(location,
new ClassOrInterfaceType(location, "String", null, new List<TypeArgument>(), new List<Annotation>()),
1),
"args",
false,
false,
new List<Annotation>()
)
},
new List<TypeReference>(),
new BlockStatement(location, new List<Statement>()),
null
);
var helloWorldClass = new ClassDeclaration(
location,
"HelloWorld",
Modifiers.Public,
new List<Annotation>(),
new List<TypeParameter>(),
null,
new List<TypeReference>(),
new List<MemberDeclaration> { mainMethod },
new List<TypeDeclaration>(),
null,
false
);
var compilationUnit = new CompilationUnit(
location,
null,
new List<ImportDeclaration>(),
new List<TypeDeclaration> { helloWorldClass }
);
// Use visitors to analyze the AST
var classCollector = new ClassNameCollector();
compilationUnit.Accept(classCollector);
Assert.Single(classCollector.ClassNames);
Assert.Equal("HelloWorld", classCollector.ClassNames[0]);
var nodeCounter = new NodeCounter();
compilationUnit.Accept(nodeCounter);
Assert.Equal(1, nodeCounter.ClassCount);
Assert.Equal(1, nodeCounter.MethodCount);
}
[Fact]
public void DemonstratesVisitorPattern()
{
// Create AST nodes
var location = new SourceRange(
new SourceLocation(1, 1, 0, 0),
new SourceLocation(1, 1, 0, 0)
);
var stringLiteral = new LiteralExpression(location, "Hello, World!", LiteralKind.String);
var methodCall = new MethodCallExpression(
location,
new FieldAccessExpression(
location,
new IdentifierExpression(location, "System"),
"out"
),
"println",
new List<TypeArgument>(),
new List<Expression> { stringLiteral }
);
var statement = new ExpressionStatement(location, methodCall);
var block = new BlockStatement(location, new List<Statement> { statement });
// Extract string literals
var extractor = new StringLiteralExtractor();
block.Accept(extractor);
Assert.Single(extractor.StringLiterals);
Assert.Equal("Hello, World!", extractor.StringLiterals[0]);
// Find method calls
var finder = new MethodCallFinder("println");
block.Accept(finder);
Assert.Single(finder.FoundCalls);
Assert.Equal("println", finder.FoundCalls[0].MethodName);
}
[Fact]
public void DemonstratesASTNavigation()
{
// Create a nested structure
var location = new SourceRange(
new SourceLocation(1, 1, 0, 0),
new SourceLocation(1, 1, 0, 0)
);
var innerClass = new ClassDeclaration(
location,
"InnerClass",
Modifiers.Private | Modifiers.Static,
new List<Annotation>(),
new List<TypeParameter>(),
null,
new List<TypeReference>(),
new List<MemberDeclaration>(),
new List<TypeDeclaration>(),
null,
false
);
var outerClass = new ClassDeclaration(
location,
"OuterClass",
Modifiers.Public,
new List<Annotation>(),
new List<TypeParameter>(),
null,
new List<TypeReference>(),
new List<MemberDeclaration>(),
new List<TypeDeclaration>(),
null,
false
);
// Navigate the AST
Assert.Empty(outerClass.Members); // Changed test since we can't nest classes as members currently
// Check modifiers
Assert.True(outerClass.Modifiers.IsPublic());
Assert.True(innerClass.Modifiers.IsPrivate());
Assert.True(innerClass.Modifiers.IsStatic());
}
[Fact]
public void DemonstratesPrettyPrinting()
{
// Create a simple AST
var location = new SourceRange(
new SourceLocation(1, 1, 0, 0),
new SourceLocation(1, 1, 0, 0)
);
var packageDecl = new PackageDeclaration(location, "com.example", new List<Annotation>());
var importDecl = new ImportDeclaration(location, "java.util.List", false, false);
var field = new FieldDeclaration(
location,
Modifiers.Private,
new List<Annotation>(),
new ClassOrInterfaceType(location, "String", null, new List<TypeArgument>(), new List<Annotation>()),
new List<VariableDeclarator>
{
new VariableDeclarator(location, "name", 0, null)
},
null
);
var testClass = new ClassDeclaration(
location,
"Test",
Modifiers.Public,
new List<Annotation>(),
new List<TypeParameter>(),
null,
new List<TypeReference>(),
new List<MemberDeclaration> { field },
new List<TypeDeclaration>(),
null,
false
);
var compilationUnit = new CompilationUnit(
location,
packageDecl,
new List<ImportDeclaration> { importDecl },
new List<TypeDeclaration> { testClass }
);
// Pretty print
var printer = new PrettyPrinter();
var output = compilationUnit.Accept(printer);
Assert.Contains("CompilationUnit", output);
Assert.Contains("Package: com.example", output);
Assert.Contains("Import: java.util.List", output);
Assert.Contains("Class: public Test", output);
Assert.Contains("Field: private", output);
Assert.Contains("Variable: name", output);
}
}
}