Skip to content

Commit

Permalink
Java Method Signature parser (initial landing)
Browse files Browse the repository at this point in the history
  • Loading branch information
enebo committed Mar 3, 2010
1 parent 4ceb48a commit 33855d8
Show file tree
Hide file tree
Showing 16 changed files with 2,938 additions and 0 deletions.
3 changes: 3 additions & 0 deletions default.build.properties
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ mspec.tar.file=${build.dir}/mspec.tgz
rubyspec.1.8.dir=${rubyspec.dir}/1.8
spec.tags.dir=${spec.dir}/tags
build.lib.dir=build_lib
parser.dir=src/org/jruby/parser
jflex.bin=jflex
jay.bin=jay
rspec.gem=${build.lib.dir}/rspec-1.3.0.gem
rake.gem=${build.lib.dir}/rake-0.8.7.gem
ruby.debug.gem=${build.lib.dir}/ruby-debug-0.10.3.gem
Expand Down
15 changes: 15 additions & 0 deletions rakelib/parser.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
def jflex(file)
sh "#{JFLEX_BIN} #{file}"
end

def jay(name='JavaSignatureParser', skeleton='signature_skeleton.parser')
sh "#{JAY_BIN} #{PARSER_DIR}/#{name}.y < #{PARSER_DIR}/#{skeleton} | grep -v ^//t > #{PARSER_DIR}/#{name}.java"
end


namespace :parse do
task :generate_java_signature_parser do
jflex 'src/org/jruby/lexer/JavaSignatureLexer.flex'
jay 'JavaSignatureParser', 'signature_skeleton.parser'
end
end
84 changes: 84 additions & 0 deletions src/org/jruby/ast/java_signature/MethodSignatureNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package org.jruby.ast.java_signature;

import java.util.List;

/**
* Java Method signature declaration
*/
public class MethodSignatureNode {
protected List<Modifier> modifiers;
protected String name;
protected List<ParameterNode> parameterList;
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> getParameterList() {
return parameterList;
}

public TypeNode getReturnType() {
return returnType;
}

public void setReturnType(TypeNode returnType) {
this.returnType = returnType;
}

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

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(' ');
}

builder.append(returnType).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();
}
}
21 changes: 21 additions & 0 deletions src/org/jruby/ast/java_signature/Modifier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.jruby.ast.java_signature;

/**
* valid method declaration modifiers
*/
public enum Modifier {
PUBLIC("public"), PROTECTED("protected"), PRIVATE("private"), STATIC("static"),
ABSTRACT("abstract"), FINAL("final"), NATIVE("native"), SYNCHRONIZED("synchronized"),
TRANSIENT("transient"), VOLATILE("volatile"), STRICTFP("strictfp");

private String name;

Modifier(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}
}
55 changes: 55 additions & 0 deletions src/org/jruby/ast/java_signature/ParameterNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.jruby.ast.java_signature;

// Fixme: varargs and variableNames with [] on them should ammend type on construction to save
// consumer the effort.
public class ParameterNode {
private final TypeNode type;
private final String variableName;
private boolean isFinal = false;
private boolean isVarArgs = false;

public ParameterNode(TypeNode type, String variableName) {
this.type = type;
this.variableName = variableName;
}

public ParameterNode(TypeNode type, String variableName, boolean isFinal) {
this(type, variableName);

this.isFinal = isFinal;
}

public ParameterNode(TypeNode type, String variableName, boolean isFinal, boolean isVarArgs) {
this(type, variableName, isFinal);

this.isVarArgs = isVarArgs;
}

public TypeNode getType() {
return type;
}

public String getVariableName() {
return variableName;
}

public boolean isFinal() {
return isFinal;
}

public boolean isVarArgs() {
return isVarArgs;
}

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

if (isFinal) builder.append("final ");
builder.append(type);
if (isVarArgs()) builder.append("...");
if (variableName != null) builder.append(" ").append(variableName);

return builder.toString();
}
}
37 changes: 37 additions & 0 deletions src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

/**
* For Java primitive types: byte, short, int, long, char, float, double, boolean, void
*/
public class PrimitiveTypeNode extends TypeNode {
public static PrimitiveTypeNode BYTE = new PrimitiveTypeNode("byte");
public static PrimitiveTypeNode SHORT = new PrimitiveTypeNode("short");
public static PrimitiveTypeNode INT = new PrimitiveTypeNode("int");
public static PrimitiveTypeNode LONG = new PrimitiveTypeNode("long");
public static PrimitiveTypeNode CHAR = new PrimitiveTypeNode("char");
public static PrimitiveTypeNode FLOAT = new PrimitiveTypeNode("float");
public static PrimitiveTypeNode DOUBLE = new PrimitiveTypeNode("double");
public static PrimitiveTypeNode BOOLEAN = new PrimitiveTypeNode("boolean");
public static PrimitiveTypeNode VOID = new PrimitiveTypeNode("void");

// This should only be used by constants above, but I left it a little open if you want to
// add your own new primitives!
protected PrimitiveTypeNode(String name) {
super(name);
}

@Override
public boolean isPrimitive() {
return true;
}

@Override
public String toString() {
return name;
}
}
21 changes: 21 additions & 0 deletions src/org/jruby/ast/java_signature/ReferenceTypeNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

/**
*
* @author enebo
*/
public class ReferenceTypeNode extends TypeNode {
public ReferenceTypeNode(String name) {
super(name);
}

@Override
public String toString() {
return name;
}
}
33 changes: 33 additions & 0 deletions src/org/jruby/ast/java_signature/TypeNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.jruby.ast.java_signature;

/**
* Base class for all typed nodes
*/
public class TypeNode {
protected String name;
protected boolean isArray = false;

public TypeNode(String name) {
this.name = name;
}

public String getName() {
return name;
}

public boolean isPrimitive() {
return false;
}

public boolean isTyped() {
return false;
}

public boolean isArray() {
return isArray;
}

public void setIsArray(boolean isArray) {
this.isArray = isArray;
}
}
14 changes: 14 additions & 0 deletions src/org/jruby/ast/java_signature/TypedReferenceNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

/**
*
* @author enebo
*/
public class TypedReferenceNode {

}
25 changes: 25 additions & 0 deletions src/org/jruby/ast/java_signature/TypedReferenceTypeNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.jruby.ast.java_signature;

/**
*
* @author enebo
*/
public class TypedReferenceTypeNode extends ReferenceTypeNode {
protected Object typeParameter;

public TypedReferenceTypeNode(String typeName, Object typeParameter) {
super(typeName);

this.typeParameter = typeParameter;
}

@Override
public boolean isTyped() {
return true;
}
}
Loading

0 comments on commit 33855d8

Please sign in to comment.