问题标签 [roslyn]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
614 浏览

c# - 使用 Roslyn-CTP 的单个右大括号的奇怪解析行为

我们正在用 roslyn 编写代码生成器。除其他事项外,用户应该能够指定方法主体的单个语句或属性的 getter/setter 主体。因此,他将字符串列表传递给翻译方法。当将单个花括号作为语句传递时,右括号会以某种方式被吞掉。

方法:

输入:

SyntaxList 将用于新方法声明(最后一个参数):

我还尝试单独处理单个右大括号,但我没有设法创建一个只有一个右大括号的语句。

奇怪的是,单个左大括号被解析为语法块(正确与否),但手动创建该语法块似乎是不可能的。既不用于开口,也不用于闭合支架。

我不想添加对这些语句的自定义解析,因为我们决定让 Roslyn 摆脱解析任务。有人知道如何处理这些特殊声明吗?或者也许有人可以用另一种方法来处理这个问题。任何帮助表示赞赏。提前致谢。

0 投票
2 回答
492 浏览

c# - 您可以缓存已编译的代码以针对不同的 Session/hostObject 执行吗?

我们目前使用 IronPython 作为脚本语言,以允许我们的业务用户配置大部分应用程序,并且我们正在评估在 Roslyn 发布后添加 C# 作为脚本语言的可能性。对于 IronPython,我们使用Microsoft.Scripting.Hosting.CompiledCode缓存编译的代码并针对不同的ScriptScope对象执行它。

环顾最新的 Rosyln CTP,我没有看到一种明显的方法来编译代码,然后针对不同的SessionshostObjects. 这个功能目前是否可用,如果没有,它会在发布时可用吗?

0 投票
1 回答
4680 浏览

c# - 如何在 CompilationUnit 中找到方法 Symbol 的 SyntaxNode?

我在编译单元中添加了一堆节点,现在我想查找与给定符号对应的语法节点:

我如何获得该符号的令牌?

笔记:

我的目标是能够从中获取每个方法的方法体MethodSymbol

0 投票
2 回答
1393 浏览

c# - Roslyn 语句创建的字符串转义问题

我有以下代码,它构建了一个调用 Roslyn 代码的 Roslyn 语句,但我遇到了字符串转义的问题。

这是代码:

问题是通过脚本引擎执行打印到控制台窗口的“语句”将错过“Hello {0}”字符串周围的反斜杠。如果我在参数中添加双重转义(附加 \ ,Roslyn 将引发有关缺少逗号的编译错误。

如何更新此代码以获取我想要的语句变量的语法正确版本?

0 投票
2 回答
394 浏览

c# - Roslyn 有内置的“简化”吗?

是否有任何内置方法可以使用 Roslyn 执行与 C# 编译器相同的编译时转换,例如将迭代器、初始化器、lambda、LINQ 等转换为基本 C# 代码?

0 投票
2 回答
988 浏览

c# - SyntaxRewriter.Visit* 不会访问 * 类型的所有节点

已解决: mike z 是对的,我没有正确调用基础来继续递归。谢谢,迈克

我正在使用 Roslyn 进行一些代码重写,通过实现一个SyntaxRewriter.

我遇到的奇怪的事情是,当覆盖时SyntaxNode.VisitInvocationExpression(InvocationExpressionSyntax),它不会访问InvocationExpressionSyntax树中的所有节点。(我认为所有SyntaxNode类型都相同)

例如,给定这个调用表达式:

它只访问整个表达式的节点,即使那里有 2 次调用。

虽然我当然可以编写递归函数或类似函数来解析子/嵌套 InvocationExpression 节点,但这似乎不一致且不方便。
为什么不访问整个树中所有 * 类型的节点?

这是我的覆盖:

在调试中单步执行该代码确认InvocationExpressionNodeforcontroller.Add(5, 6).ToString();确实有子InvocationExpressionNodes嵌套在里面。

0 投票
1 回答
272 浏览

c# - 从 ArgumentListSyntax 中删除 OpenParen SyntaxToken 的简单方法?

假设我有这个 InvocationExpression, GetDelegate<Func<double,double,double>>("Add")(),我将如何删除 ArgumentListSyntax 中的 Open/Close 括号?
我试图找出 Node.ReplaceNodes<>() 方法,但即使这样,我也不知道如何用任何东西替换节点。

我正在检查这段示例代码,他将整个节点撕成组件,只是为了改变它。没有更简单的方法可以做到这一点吗?我找不到任何 Node.RemoveNode()方法。

我也试图做这样的事情,但没有成功:

澄清: 我正在尝试修改这个 InvocationExpression :

GetDelegate<Func<double,double,double>>("Add")()

GetDelegate<Func<double,double,double>>("Add")

我试图解决的问题:

从这段代码开始。

我想把它变成这个。请注意这只是半伪代码,我实际上正在做一堆更复杂的静态泛型类型的东西,为了清楚起见,这被简化了。

对于在整个项目中找到的每个调用,如果在 StoredMethods 中找到方法名称,则将调用替换为 StoredMethod 调用。结果应该是这样的:

我更大的问题是试图弄清楚如何处理嵌套/组合的类和成员。我认为递归可以处理多个 MemeberAccess 表达式,但我很难将问题分解以解决问题。另外,我SyntaxRewriter用来访问每个节点,所以我不确定如何将编译单元带入其中

0 投票
2 回答
357 浏览

windows-8 - 我可以将 roslyn 与 Windows Metro 或 RT 应用程序一起使用吗?

我想知道是否可以创建一个使用 Roslyn 库的 Metro 风格(甚至是 ARM 上的 Windows RT)应用程序?

roslyn 库未列在 Metro 可用的命名空间中,但我可以将 roslyn dll 包含在我的应用程序中吗?(或者他们是否使用 Metro 不提供的 API?)。

0 投票
1 回答
289 浏览

c# - 从外部 VS 主机环境中检测 VS 的 IWorkspace 更改?

使用 Roslyn 的工作区,有没有办法获得一个挂钩到 Visual Studio 提供的活动 IWorkspace?

我希望能够在 Visual Studio 中打开 ExampleProject,然后在我自己的应用程序中,我想通过 再次打开 ExampleProject Roslyn.Services.Workspace,但仅用于监视在 Visual Studio 中生成的文件/代码更改。我进行了一次充满希望的测试,只是将项目加载到工作区中,并希望它会以某种方式神奇地从磁盘中获取更改,但没有这样的运气。

剩下的唯一可能性是;

  1. 直接从 Visual Studio 获取对当前加载的工作区的引用。我不知道 VS 是否甚至跨进程边界暴露了这一点,或者如何找出来。

  2. 将我的整个项目重新设计为 Visual Studio 扩展,在那里我可以自动访问打开的工作区。我现在不想深入构建扩展。

这是我用来测试的一些代码:

0 投票
2 回答
3258 浏览

c# - 如何验证已为所有用途创建了自动映射器映射?

我想要一个测试来验证,对于每次使用,在我的 BootstrapperAutomapper.Mapper.Map<T1,T2>()中有一个相应的映射配置 ( )。AutoMapper.Mapper.CreateMap<T1,T2>()

我正要走上使用Roslyn与编译器接口的道路,并找到该Map<>方法的所有用法,然后尝试使用这些实例进行映射。尽管这样做可以解决问题,但我想我宁愿使用已经存在的东西。

这存在吗?如果没有,还有比 Roslyn 更好的方法吗?