Eclipse JDT ASTParser-MethodVisitor的问题 [英] Eclipse JDT ASTParser - Issue with MethodVisitor

查看:84
本文介绍了Eclipse JDT ASTParser-MethodVisitor的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一些代码来解析Java源代码.我正在尝试使用Eclipse JDT AST解析器.我的代码如下. (解析代码).我正在针对我用Java编写的Mailer应用程序(第二代码段)测试解析器.我的解析器正在访问除generateEmail()和debug()方法之外的所有方法.我到处都看了一下,但是我一生都无法理解为什么会发生这种情况.谁能告诉我我在做什么错?这是内存问题吗?我没有收到任何OutOfMemoryException

I am writing some code to parse java source code. I am experimenting with Eclipse JDT AST Parser. My code is given below. (Parsing code). I am testing the parser against a Mailer application that I wrote in Java (second code snippet). My parser is visiting all methods except the generateEmail() and the debug() methods. I have looked all over the place but I am not able to understand for the life of me why its happening. Can anyone tell me what I am doing wrong? Is it a memory issue? I am not getting any OutOfMemoryException

我想使用MethodVisitor方法访问特定方法,以访问特定方法中的语句和变量.

I want to visit the specific methods with the MethodVisitor method to get access to statements and variables in a particular method.

我的解析代码

public class RuleEngine {

public static void parse(String file) {
    File java = new File(file);
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    String code = readFile(java);
    parser.setSource(code.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);


    cu.accept(new ASTVisitor() {

        public boolean visit(ImportDeclaration id) {
            Name imp = id.getName();
            debug("import", id.getName().getFullyQualifiedName());
            return false;
        }

        public boolean visit(VariableDeclarationFragment node) {
            SimpleName name = node.getName();
            debug("var.declaration", (name.getFullyQualifiedName() + ":" + cu.getLineNumber(name.getStartPosition())));
            return false; // do not continue 
        }

        public boolean visit(MethodDeclaration method) {
            debug("method", method.getName().getFullyQualifiedName());
            debug("method.return", method.getReturnType2().toString());
            List<SingleVariableDeclaration> params = method.parameters();

            for(SingleVariableDeclaration param: params) {
                debug("param", param.getName().getFullyQualifiedName());
            }

            Block methodBlock = method.getBody();
            String myblock = methodBlock.toString();
            methodVisitor(myblock);
            return false;
        }


    });

}

public static void methodVisitor(String content) {
    debug("entering met visitor", "1");
    ASTParser metparse = ASTParser.newParser(AST.JLS3);
    metparse.setSource(content.toCharArray());
    metparse.setKind(ASTParser.K_STATEMENTS);
    Block block = (Block) metparse.createAST(null);

    block.accept(new ASTVisitor() {
        public boolean visit(VariableDeclarationFragment var) {
            debug("met.var", var.getName().getFullyQualifiedName());
            return false;
        }

        public boolean visit(SimpleName node) {
            debug("SimpleName node", node.getFullyQualifiedName());
            return false;
        }
        public boolean visit(IfStatement myif) {
            debug("if.statement", myif.toString());
            return false;
        }

    });
}

public static void debug(String ref, String message) {
    System.out.println(ref +": " + message);
}

public static void main(String[]args) {
    parse("MailerDaemon.java");
}

这是我的MailerDaemon代码

This is my MailerDaemon Code

public boolean isBccMode() {
    return bccMode;
}

public void setBccMode(boolean bccMode) {
    this.bccMode = bccMode;
}

public void setServerPort(String serverPortAddr) {
    String[] elems = serverPortAddr.split("\\:");
    this.setServerAddr(elems[0]);
    this.setSmtpPort(elems[1]);
}

public String getServerAddr() {
    int i = 0;
    return serverAddr;
}
public void setServerAddr(String serverAddr) {
    this.serverAddr = serverAddr;
}
public boolean isSslOn() {
    return isSslOn;
}
public void setSslOn(boolean isSslOn) {
    this.isSslOn = isSslOn;
}
public String getSmtpPort() {
    return smtpPort;
}
public void setSmtpPort(String smtpPort) {
    this.smtpPort = smtpPort;
}
public String getFromEmail() {
    return fromEmail;
}
public void setFromEmail(String fromEmail) {
    this.fromEmail = fromEmail;
}
public String getToEmails() {
    return toEmails;
}
public void setToEmails(String toEmails) {
    this.toEmails = toEmails;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getSubject() {
    return subject;
}
public void setSubject(String subject) {
    this.subject = subject;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public String getCcList() {
    return ccList;
}
public void setCcList(String ccList) {
    this.ccList = ccList;
}
public String getBccList() {
    return bccList;
}
public void setBccList(String bccList) {
    this.bccList = bccList;
}



public String getFile() {
    return file;
}
public void setFile(String file) {
    debug("filename: " + file);
    this.file = file;
}
public void generateEmail() {
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", this.getSmtpPort());
    if(isSslOn()) {
        props.put("mail.smtp.socketFactory.port", this.getSmtpPort());
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    }
    props.put("mail.smtp.host", getServerAddr());

    Session session = Session.getDefaultInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(getUsername(), getPassword());
        }
    });


    Message msg = new MimeMessage(session);
    try {
        msg.setFrom(new InternetAddress(this.getFromEmail()));
        if (getToEmails() != null) {
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getToEmails()));
        } else if (isBccMode()) {
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getFromEmail()));
        }

        //msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(getCcList()));
        msg.setSubject(getSubject());
        //msg.setText(getMessage());
        MimeBodyPart messagePart = new MimeBodyPart();
        messagePart.setText(getMessage());

        /*
        MimeBodyPart attachments = new MimeBodyPart();
        FileDataSource fd = new FileDataSource(getFile());
        attachments.setDataHandler(new DataHandler(fd));
        attachments.setFileName(fd.getName());
        */

        Multipart mp = new MimeMultipart();
        mp.addBodyPart(messagePart);
        //mp.addBodyPart(attachments);

        msg.setContent(mp);
        Transport.send(msg);
        debug("Done. Closing Session...");

    } catch (AddressException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static void debug(String message) {
    System.out.println("[DEBUG]: " + message);
}

推荐答案

我认为您的解析代码没有明显的问题.我希望它在尝试解析generateEmail()方法时在某处失败.由于解析器遵循顺序方法,因此debug()方法也不会被解析.尝试将public boolean visit(MethodDeclaration method)中的语句包含在try-catch块中,并可能包含Throwable子句.

I see no evident problem with your parsing code. I hope its failing somewhere when its trying to parse the generateEmail() method. Since the parser follows a sequential approach, the debug() method is also not getting parsed. Try to enclose the statements within the public boolean visit(MethodDeclaration method) in a try-catch block with probably a Throwable clause.

还要检查您的readFile()方法.缺少一个在读取文件时经常看到的问题,无法在每行中添加换行符.不添加新行会导致错误的代码构造,尤其是当代码中有注释时.您可以检查compilationUnit.getProblems()方法以检查任何此类问题.

Also have a check for your readFile() method. One issue that is mostly seen while reading a file is missing to append new line character to each line. Not appending a new line results in erroneous construction of the code, especially when there are comments in the code. You may inspect compilationUnit.getProblems() method to check any such problems.

这篇关于Eclipse JDT ASTParser-MethodVisitor的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆