Decide on scope names for all language constructs

Open
#8 10 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
25/100
Issue type
Feature
Clarity
Needs clarification
Activity status
Stale
Tech stack
powershell
Domain
tooling

Research direction

Review the scope-name table and the refactored language file mentioned in the issue, then compare the proposed names with the documented VS Code theme scopes. The work is done when the scope naming discussion reaches an agreed convention for the listed PowerShell constructs and the table reflects that decision.

Written by the indexing model from the issue text.

Description

discussion

I'd like to have a discussion where we decide on the "correct" scope names for all PowerShell language constructs. This will mean much less work when doing updates to the tmLanguage file in the future, as the scopes (as well as the color(!) of each) are checked by a Travis CI build job on the vscode repo.

General
  • All scope names should end in .powershell

As we decide, we can fill out this table:

Language construct Scope Name Comments/Examples
Line comment comment.line.number-sign # comments
Block comment comment.block <# comments #>
Help directives comment.documentation.embedded Meta scope
Help directives - keywords keyword.operator.documentation .SYNOPSIS
Help directives - keyword value constant.string.documentation 'ParameterName' in .PARAMETER ParameterName
#Requires statement keywords.operator.documentation 'Requires' in #Requires -Version 3.0
#Requires statement - parameter constant.string.documentation '-Version 3.0' in #Requires -Version 3.0
String - double quoted string.quoted.double "string"
String - single quoted string.quoted.single 'string'
String - escape characters constant.character.escape 't' in "onettwo"
String - heredoc double quoted string.quoted.double.heredoc
String - heredoc single quoted string.quoted.single.heredoc
ScriptBlock meta.scriptblock { ... }
SubExpression meta.subexpression $( ... )
Hashtable meta.hashtable @{ ... }
Array meta.array @(1,2,3) & (1,2,3)
Property/Member entity.other.attribute-name 'property' in (Invoke-Something).property & 'property' in $var.property
Numeric Constant - real constant.numeric.real +.5
Numeric Constant - integer constant.numeric.integer 5
Numeric Constant - hexadecimal constant.numeric.hexadecimal 0x20
Type entity.name.type 'string' in [string]
Type - static method meta.method '::MinValue' in [int]::MinValue
Parameter decorator entity.name.type 'Parameter' in [Parameter(Position = 1)]
Parameter decorator - property entity.other.attribute-name 'Position' in [Parameter(Position = 1)]
Function meta.function Meta scope
Function - keyword storage.type 'function' in function script:Invoke-Something { ... }
Function - scope storage.modifier.scope 'script' in function script:Invoke-Something { ... }
Function - name entity.name.function 'Invoke-Something' in function script:Invoke-Something { ... }
Command meta.command Meta scope
Command - keyword support.function 'Invoke-Something' in Invoke-Something -p1 'v1'
Command - parameter variable.parameter '-p1' in Invoke-Something -p1 'v1'
Reserved words keyword.other configuration
Control words keyword.control break
Enum - keyword storage.type 'enum' in enum myEnum { ... }
Enum - name entity.name.function 'myEnum' in enum myEnum { ... }
Class meta.class Meta scope
Class - keyword storage.type 'class' in class myClass : inheritedClass { ... }
Class - name entity.name.function 'myClass' in class myClass : inheritedClass { ... }
Class - inheritance entity.other.inherited-class 'inheritedClass' in class myClass : inheritedClass { ... }
Class - reserved words keyword.other hidden & static
Class - control words keyword.control.class 'base' in : base( ... )
Operator - redirection keyword.operator.redirection 2>&1
Operator - comparison keyword.operator.comparison -gt
Operator - bitwise keyword.operator.bitwise -band
Operator - logical keyword.operator.logical -and
Operator - format keyword.operator.format -f
Operator - assignment keyword.operator.assignment +=
Operator - logical not keyword.operator.logical-not -not & !
Operator - multiplicative keyword.operator.multiplicative / & *
Operator - unary plus keyword.operator.unary-plus +
Operator - unary minus keyword.operator.unary-minus -
Operator - additive keyword.operator.additive + & -
Operator - range keyword.operator.range ..
Operator - command invocation keyword.operator.other &
Operator - stop parsing keyword.operator --%
Switch - keyword keyword.control 'switch' in switch -regex ($var) { ... }
Switch - parameter variable.parameter '-regex' in switch -regex ($var) { ... }
Switch - reserved word keyword.other default
Illegal invalid.illegal Space after backtick
Variable - $ keyword.other '$' in $variable
Variable - ${..} keyword.other '${' and '}' in ${variable}
Variable - automatic constant.language $_ & $error
Variable - scope storage.modifier.scope 'script' in $script:variable
Variable - name variable.other.readwrite 'variable' in $script:variable

I have started by filling out the scope names as I have used them in my refactored language file.

About scopes and highlighting

If, in the theme, there are colorization rules only for the scope constant.operator, both constant.operator and constant.operator.range will be colorized the same.

If there isn't any colorization rules for a scope, it will be colorized with the "root" color of the current scope. Meaning if the word 'test' only belong to the source scope (or have a scope name that is not defined in the current theme), it will be colorized with the default background color. If the word 'test' is found inside another scope, for instance a string, it will be colorized with the color for the string scope.

Colorization rules may differ between editors. For instance the background parameter. This is supported on Sublime Text, but not in VSCode.

A matched set of characters can be (and more often than not are) assigned multiple scopes. So for example the word variable in function MyFunction {"this is $("a $variable")"} have the following scopes: source, string.quoted.double, meta.subexpression, string.quoted.double and lastly variable.other.readwrite. Only the last one is used for colorization.

About the default themes in VSCode

There are five themes that are defined as default themes in Visual Studio Code:

  • dark_plus "Dark+"
  • dark_vs "Dark Visual Studio"
  • hc_black "Dark Visual Studio"
  • light_plus "Light+"
  • light_vs "Light Visual Studio"

The themes supports nesting, and:

  • Light+ includes light_vs (Light Visual Studio)
  • Dark+ includes dark_vs (Dark Visual Studio)

The following scopes are defined in the plus-themes:

  • meta.type.name, meta.return.type, meta.return-type, meta.cast, meta.type.annotation, support.type, entity.name.class, entity.name.type, storage.type.cs, storage.type.java
  • entity.name.function, entity.name.method
  • keyword.control
  • meta.parameter.type.variable, variable.parameter, variable, variable.name

The following scopes are defined in the "old" default themes:

  • emphasis
  • strong
  • header
  • comment
  • constant.language
  • constant.numeric
  • constant.regexp
  • constant.rgb-value
  • entity.name.tag
  • entity.name.selector
  • entity.other.attribute-name
  • entity.other.attribute-name.css
  • invalid
  • markup.underline
  • markup.bold
  • markup.heading
  • markup.italic
  • markup.inserted
  • markup.deleted
  • markup.changed
  • meta.selector
  • meta.tag
  • meta.preprocessor
  • meta.preprocessor.string
  • meta.preprocessor.numeric
  • meta.structure.dictionary.key.python
  • storage
  • storage.type
  • storage.modifier
  • string
  • string.xml, string.jade, string.yaml, string.html
  • string.regexp
  • support.property-value
  • support.type.property-name.css, support.type.property-name.less, support.type.property-name.sass
  • support.type.property-name
  • keyword
  • keyword.control
  • keyword.operator
  • keyword.operator.new
  • keyword.other.unit
  • keyword.control.less
  • metatag.php
  • support.function.git-rebase
  • constant.sha.git-rebase
  • storage.modifier.import.java, storage.modifier.package.java

Scope names on the same line, means they are defined in the same colorization rule.

Dominant language
PowerShell
Stars
151
Forks
55
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from PowerShell/EditorSyntax

All issues in PowerShell/EditorSyntax

Similar issues

More DevTools issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.