首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是我的界面,所以叫我...maybe

这是我的界面,所以叫我...maybe
EN

Code Review用户
提问于 2015-04-07 00:02:37
回答 1查看 222关注 0票数 10

我正在检查VBA代码以查找过时的代码构造--即显式Call语句,如下所示:

呼叫DoSomething(42)

“正确”的代码构造是省略Call令牌并删除括号--我的代码定位过时的Call语句,并像这样重写它们:

DoSomething 42

我有一个IdentifierReference类,用于在我解析的整个VBA代码中存储各种标识符引用的上下文。为了让我的代码检查能够轻松地找到使用过时的Call语法的方法调用,我将这个方法添加到IdentifierReference类中:

代码语言:javascript
复制
public bool HasExplicitCallStatement()
{
    try
    {
        var call = ((dynamic)Context.Parent).CALL();
        return call != null && call.Symbol.Text == Tokens.Call;
    }
    catch (Exception)
    {
        return false;
    }
}

但是我不喜欢在这里处理异常,所以我用更强类型的方式重写了它,如下所示:

代码语言:javascript
复制
public bool HasExplicitCallStatement()
{
    var memberProcedureCall = Context.Parent as VBAParser.ECS_MemberProcedureCallContext;
    var procedureCall = Context.Parent as VBAParser.ECS_ProcedureCallContext;

    return HasExplicitCallStatement(memberProcedureCall) 
        || HasExplicitCallStatement(procedureCall);
}

private bool HasExplicitCallStatement(VBAParser.ECS_MemberProcedureCallContext context)
{
    if (context == null)
    {
        return false;
    }
    var statement = context.CALL();
    return statement != null && statement.Symbol.Text == Tokens.Call;
}

private bool HasExplicitCallStatement(VBAParser.ECS_ProcedureCallContext context)
{
    if (context == null)
    {
        return false;
    }
    var statement = context.CALL();
    return statement != null && statement.Symbol.Text == Tokens.Call;
}

现在我想知道..。这真的是一个进步吗?

是否有更优雅的方法来处理应该共享接口而不是共享的不同类型呢?ECS_ProcedureCallContextECS_MemberProcedureCallContext是ANTLR生成的类型,嵌套在VBAParser类中,由我使用的语法文件生成。

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-07 05:10:21

回到你原来的代码。我认为一点反思就能让你摆脱尝试捕捉阻塞的局面。

代码语言:javascript
复制
public bool HasExplicitCallStatement()
{
    var theObject = ((dynamic) Context.Parent);
    if(theObject.GetType().GetMethod("CALL") != null)
    {
        var call = theObject.CALL();
        return call != null && call.Symbol.Text == Tokens.Call;
    }

    return false; 
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/86084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档