问题标签 [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.
c# - 使用 Roslyn-CTP 的单个右大括号的奇怪解析行为
我们正在用 roslyn 编写代码生成器。除其他事项外,用户应该能够指定方法主体的单个语句或属性的 getter/setter 主体。因此,他将字符串列表传递给翻译方法。当将单个花括号作为语句传递时,右括号会以某种方式被吞掉。
方法:
输入:
SyntaxList 将用于新方法声明(最后一个参数):
我还尝试单独处理单个右大括号,但我没有设法创建一个只有一个右大括号的语句。
奇怪的是,单个左大括号被解析为语法块(正确与否),但手动创建该语法块似乎是不可能的。既不用于开口,也不用于闭合支架。
我不想添加对这些语句的自定义解析,因为我们决定让 Roslyn 摆脱解析任务。有人知道如何处理这些特殊声明吗?或者也许有人可以用另一种方法来处理这个问题。任何帮助表示赞赏。提前致谢。
c# - 您可以缓存已编译的代码以针对不同的 Session/hostObject 执行吗?
我们目前使用 IronPython 作为脚本语言,以允许我们的业务用户配置大部分应用程序,并且我们正在评估在 Roslyn 发布后添加 C# 作为脚本语言的可能性。对于 IronPython,我们使用Microsoft.Scripting.Hosting.CompiledCode
缓存编译的代码并针对不同的ScriptScope
对象执行它。
环顾最新的 Rosyln CTP,我没有看到一种明显的方法来编译代码,然后针对不同的Sessions
或hostObjects
. 这个功能目前是否可用,如果没有,它会在发布时可用吗?
c# - 如何在 CompilationUnit 中找到方法 Symbol 的 SyntaxNode?
我在编译单元中添加了一堆节点,现在我想查找与给定符号对应的语法节点:
我如何获得该符号的令牌?
笔记:
我的目标是能够从中获取每个方法的方法体MethodSymbol
。
c# - Roslyn 语句创建的字符串转义问题
我有以下代码,它构建了一个调用 Roslyn 代码的 Roslyn 语句,但我遇到了字符串转义的问题。
这是代码:
问题是通过脚本引擎执行打印到控制台窗口的“语句”将错过“Hello {0}”字符串周围的反斜杠。如果我在参数中添加双重转义(附加 \ ,Roslyn 将引发有关缺少逗号的编译错误。
如何更新此代码以获取我想要的语句变量的语法正确版本?
c# - Roslyn 有内置的“简化”吗?
是否有任何内置方法可以使用 Roslyn 执行与 C# 编译器相同的编译时转换,例如将迭代器、初始化器、lambda、LINQ 等转换为基本 C# 代码?
c# - SyntaxRewriter.Visit* 不会访问 * 类型的所有节点
已解决: mike z 是对的,我没有正确调用基础来继续递归。谢谢,迈克
我正在使用 Roslyn 进行一些代码重写,通过实现一个SyntaxRewriter
.
我遇到的奇怪的事情是,当覆盖时SyntaxNode.VisitInvocationExpression(InvocationExpressionSyntax)
,它不会访问InvocationExpressionSyntax
树中的所有节点。(我认为所有SyntaxNode
类型都相同)
例如,给定这个调用表达式:
它只访问整个表达式的节点,即使那里有 2 次调用。
虽然我当然可以编写递归函数或类似函数来解析子/嵌套 InvocationExpression 节点,但这似乎不一致且不方便。
为什么不访问整个树中所有 * 类型的节点?
这是我的覆盖:
在调试中单步执行该代码确认InvocationExpressionNode
forcontroller.Add(5, 6).ToString();
确实有子InvocationExpressionNodes
嵌套在里面。
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
用来访问每个节点,所以我不确定如何将编译单元带入其中
windows-8 - 我可以将 roslyn 与 Windows Metro 或 RT 应用程序一起使用吗?
我想知道是否可以创建一个使用 Roslyn 库的 Metro 风格(甚至是 ARM 上的 Windows RT)应用程序?
roslyn 库未列在 Metro 可用的命名空间中,但我可以将 roslyn dll 包含在我的应用程序中吗?(或者他们是否使用 Metro 不提供的 API?)。
c# - 从外部 VS 主机环境中检测 VS 的 IWorkspace 更改?
使用 Roslyn 的工作区,有没有办法获得一个挂钩到 Visual Studio 提供的活动 IWorkspace?
我希望能够在 Visual Studio 中打开 ExampleProject,然后在我自己的应用程序中,我想通过 再次打开 ExampleProject Roslyn.Services.Workspace
,但仅用于监视在 Visual Studio 中生成的文件/代码更改。我进行了一次充满希望的测试,只是将项目加载到工作区中,并希望它会以某种方式神奇地从磁盘中获取更改,但没有这样的运气。
剩下的唯一可能性是;
直接从 Visual Studio 获取对当前加载的工作区的引用。我不知道 VS 是否甚至跨进程边界暴露了这一点,或者如何找出来。
将我的整个项目重新设计为 Visual Studio 扩展,在那里我可以自动访问打开的工作区。我现在不想深入构建扩展。
这是我用来测试的一些代码:
c# - 如何验证已为所有用途创建了自动映射器映射?
我想要一个测试来验证,对于每次使用,在我的 BootstrapperAutomapper.Mapper.Map<T1,T2>()
中有一个相应的映射配置 ( )。AutoMapper.Mapper.CreateMap<T1,T2>()
我正要走上使用Roslyn与编译器接口的道路,并找到该Map<>
方法的所有用法,然后尝试使用这些实例进行映射。尽管这样做可以解决问题,但我想我宁愿使用已经存在的东西。
这存在吗?如果没有,还有比 Roslyn 更好的方法吗?