Skip to content

Commit

Permalink
Add constructor signatures to signature parser
Browse files Browse the repository at this point in the history
  • Loading branch information
enebo committed Apr 5, 2010
1 parent cc64f5e commit 1dfd560
Show file tree
Hide file tree
Showing 8 changed files with 627 additions and 419 deletions.
68 changes: 68 additions & 0 deletions spec/grammar/java_signature/helpers/signature_parser_helper.rb
Expand Up @@ -28,6 +28,70 @@ def arrayOf(a_type)
end
end

class SimpleConstructorSignatureMatcher
attr_reader :errors

def initialize(*args)
@args, @errors = parse_args(*args), []
end

def parse_args(*args)
# FIXME: Error for other lengths
case args.length
when 2 then # name, params
[[], args[0], args[1], []]
when 3 then # modifiers, name, params
[args[0], args[1], args[2], []]
when 4 then # modifiers, name, params, throws
[args[0], args[1], args[2], args[3]]
end
end

def match_type?(ast_type, expected_type)
if expected_type.kind_of? Symbol
ast_type.to_s == expected_type.to_s
else
ast_type == expected_type
end
end

def match_parameters?(parameters, expected)
return false if parameters.size != expected.size

0.upto(parameters.size - 1) do |i|
return false unless match_type? parameters[i].get_type, expected[i]
end
true
end

def matches?(ast)
modifiers, name, parameters, throws = *@args
@errors << ['modifiers', ast.modifiers, modifiers] unless ast.modifiers.equals? modifiers
@errors << ['name', ast.name, name] unless ast.name == name
@errors << ['parameters', ast.parameters, parameters] unless match_parameters? ast.parameters, parameters
@errors << ['throws', ast.throws, throws] unless ast.throws.equals? throws
@errors.length == 0
end

def failure_message
@errors.inject('') do |memo, item|
memo += "#{item[0]}: "
# FIXME: Add nicer output when array mismatches
memo += "#{item[1].inspect} to equal #{item[2].inspect}\n"
memo
end
end

def negative_failure_message
@errors.inject('') do |memo, item|
memo += "#{item[0]}: "
# FIXME: Add nicer output when array mismatches
memo += "#{item[1].inspect} to not equal #{item[2].inspect}\n"
memo
end
end
end

class SimpleSignatureMatcher
attr_reader :errors

Expand Down Expand Up @@ -97,4 +161,8 @@ module Spec::Example::ExampleMethods
def have_signature(*args)
SimpleSignatureMatcher.new(*args)
end

def have_constructor_signature(*args)
SimpleConstructorSignatureMatcher.new(*args)
end
end
4 changes: 4 additions & 0 deletions spec/grammar/java_signature/simple_signatures_spec.rb
Expand Up @@ -21,4 +21,8 @@
signature('int[] foo(int bar)').should have_signature(arrayOf(INT), 'foo', [INT])
signature('int[][] foo(int bar)').should have_signature(arrayOf(arrayOf(INT)), 'foo', [INT])
end

it "should parse constructor signatures like 'public Foo(int, String)'" do
signature('Foo(int, String)').should have_constructor_signature('Foo', [INT, :String])
end
end
17 changes: 17 additions & 0 deletions src/org/jruby/ast/java_signature/ConstructorSignatureNode.java
@@ -0,0 +1,17 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

import java.util.List;

/**
*
*/
public class ConstructorSignatureNode extends SignatureNode {
public ConstructorSignatureNode(String name, List<ParameterNode> parameterList) {
super(name, parameterList);
}
}
38 changes: 2 additions & 36 deletions src/org/jruby/ast/java_signature/MethodSignatureNode.java
Expand Up @@ -5,25 +5,11 @@
/**
* Java Method signature declaration
*/
public class MethodSignatureNode {
protected List<Modifier> modifiers;
protected String name;
protected List<ParameterNode> parameterList;
protected String extraTypeInfo;
public class MethodSignatureNode extends SignatureNode {
protected TypeNode returnType;
protected List<TypeNode> throwTypes;

public MethodSignatureNode(String name, List<ParameterNode> parameterList) {
this.name = name;
this.parameterList = parameterList;
}

public String getName() {
return name;
}

public List<ParameterNode> getParameters() {
return parameterList;
super(name, parameterList);
}

public TypeNode getReturnType() {
Expand All @@ -34,26 +20,6 @@ public void setReturnType(TypeNode returnType) {
this.returnType = returnType;
}

public void setModifiers(List<Modifier> modifiers) {
this.modifiers = modifiers;
}

public void setExtraTypeInfo(String extraTypeInfo) {
this.extraTypeInfo = extraTypeInfo;
}

public List<Modifier> getModifiers() {
return modifiers;
}

public void setThrows(List<TypeNode> throwTypes) {
this.throwTypes = throwTypes;
}

public List<TypeNode> getThrows() {
return throwTypes;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Expand Down
84 changes: 84 additions & 0 deletions src/org/jruby/ast/java_signature/SignatureNode.java
@@ -0,0 +1,84 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

import java.util.List;

public class SignatureNode {
protected List<Modifier> modifiers;
protected String name;
protected List<ParameterNode> parameterList;
protected String extraTypeInfo;
protected List<TypeNode> throwTypes;

public SignatureNode(String name, List<ParameterNode> parameterList) {
this.name = name;
this.parameterList = parameterList;
}

public String getName() {
return name;
}

public List<ParameterNode> getParameters() {
return parameterList;
}

public void setModifiers(List<Modifier> modifiers) {
this.modifiers = modifiers;
}

public void setExtraTypeInfo(String extraTypeInfo) {
this.extraTypeInfo = extraTypeInfo;
}

public List<Modifier> getModifiers() {
return modifiers;
}

public void setThrows(List<TypeNode> throwTypes) {
this.throwTypes = throwTypes;
}

public List<TypeNode> getThrows() {
return throwTypes;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();

for (Modifier modifier: modifiers) {
builder.append(modifier).append(' ');
}

if (extraTypeInfo != null) {
builder.append(extraTypeInfo).append(' ');
}

builder.append(name).append('(');

int length = parameterList.size();
for (int i = 0; i < length - 1; i++) {
builder.append(parameterList.get(i)).append(", ");
}

if (length > 0) builder.append(parameterList.get(length - 1));

builder.append(')');

length = throwTypes.size();
if (length > 0) {
builder.append(" throws ");
for (int i = 0; i < length - 1; i++) {
builder.append(throwTypes.get(i)).append(", ");
}
builder.append(throwTypes.get(length - 1));
}

return builder.toString();
}
}
4 changes: 2 additions & 2 deletions src/org/jruby/lexer/JavaSignatureLexer.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1dfd560

Please sign in to comment.