10

请求:

我希望能够编写一个分析器,它可以为某个表达式提供代理值并触发对文档的重新解析。

动机:

我们的代码中充斥着 ABTest,它们可以处于已部署或活动状态,并带有控制组和变体组。通过数据库查找来确定测试的状态。对于与控制组一起部署的测试,以下形式的任何语句都将评估为 false:

if(ExperimentService.IsInVariant(ABTest.Test1))
{
}

我正在尝试提供工具,以便在开发时通过在这种情况下将其变灰来更轻松地处理它。事实上,这是相当有限且不健壮的,因为我基本上必须自己玩解析器。

如果实际代码是

if(!ExperimentService.IsInVariant(ABTest.Test1))

或者

if(ExperimentService.IsInVariant(ABTest.Test1) || true)

或者

var val = ..... && (ExperimentService.IsInVariant(ABTest.Test1);
if(val){
  // val is always going to be false if we deployed control.
}

我可以看到提供的一种可能的方法是允许我们编写一次触发的分析器并在实际 IDE 解析发生之前重写树(或者,好吧,只是第二次解析它)。这些应该只触发一次,并允许我们用另一个替换某个表达式。这将允许我将所有这些实验调用交换为真假文字。

因此,这些部分可以受益于所有其他 IDE 功能,例如无法访问代码的代码灰色化,但也可以受益于更复杂的功能,例如永远不会有不同值的变量

显然这只是一个例子,我不确定它有多可行。任何关于适当功能或已经存在的东西的建议都非常受欢迎。

4

2 回答 2

1

这还不足以真正保证赏金,但开发人员文档中可能适用的一种解决方案是创建自定义语言并扩展基本规则。

你说

我正在尝试提供工具,以便在开发时通过在这种情况下将其变灰来更轻松地处理它。

可以通过更改语法突出显示规则来将相应的部分变灰。

有关文件,请参阅此示例。.tt

于 2016-08-22T17:38:54.027 回答
1

我认为没有不妥协的方法。

ReSharper 不支持在分析之前重写 AST - 这只会重写文件中的文本。

您可以通过对块的内容应用“死代码”突出显示来编写一个使代码变灰的分析器if,但正如您所说,您需要解析代码并分析控制流以使其正确,而且我认为这将非常困难(ReSharper 确实提供了一个控制流图,因此您可以遍历它,但是这取决于您A.找到BIsInVariant的返回值。通过任何条件或语句跟踪该值直到找到合适的块)。&&||if

或者,您可以使用属性标记IsInVariant方法,例如:ContractAnnotation

[ContractAnnotation("=> false")]
public bool IsInVariant(string identifier)
{
  // whatever...
}

这会告诉 ReSharper 的分析这个方法总是返回false(你也可以说它会根据具体的输入返回 //not null )true。因为它总是返回,所以 ReSharper 会将语句中的代码或分支(如果您这样做)灰显。falsenullfalseifelseif (!IsInVariant(…))

这里的缺点是 ReSharper 还会在if语句中添加一个警告,告诉你表达式总是返回false。因此,这是一种妥协,但您可以将该警告的严重性更改为提示,因此它不会那么具有侵入性。

于 2016-08-23T14:54:37.690 回答