142 lines
8.0 KiB
Go
142 lines
8.0 KiB
Go
package lsutil
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/microsoft/typescript-go/internal/core"
|
|
"github.com/microsoft/typescript-go/internal/lsp/lsproto"
|
|
"github.com/microsoft/typescript-go/internal/printer"
|
|
)
|
|
|
|
type IndentStyle int
|
|
|
|
const (
|
|
IndentStyleNone IndentStyle = iota
|
|
IndentStyleBlock
|
|
IndentStyleSmart
|
|
)
|
|
|
|
func parseIndentStyle(v any) IndentStyle {
|
|
switch s := v.(type) {
|
|
case string:
|
|
switch strings.ToLower(s) {
|
|
case "none":
|
|
return IndentStyleNone
|
|
case "block":
|
|
return IndentStyleBlock
|
|
case "smart":
|
|
return IndentStyleSmart
|
|
}
|
|
case float64:
|
|
return IndentStyle(int(s))
|
|
case int:
|
|
return IndentStyle(s)
|
|
}
|
|
return IndentStyleSmart
|
|
}
|
|
|
|
type SemicolonPreference string
|
|
|
|
const (
|
|
SemicolonPreferenceIgnore SemicolonPreference = "ignore"
|
|
SemicolonPreferenceInsert SemicolonPreference = "insert"
|
|
SemicolonPreferenceRemove SemicolonPreference = "remove"
|
|
)
|
|
|
|
func parseSemicolonPreference(v any) SemicolonPreference {
|
|
if s, ok := v.(string); ok {
|
|
switch strings.ToLower(s) {
|
|
case "ignore":
|
|
return SemicolonPreferenceIgnore
|
|
case "insert":
|
|
return SemicolonPreferenceInsert
|
|
case "remove":
|
|
return SemicolonPreferenceRemove
|
|
}
|
|
}
|
|
return SemicolonPreferenceIgnore
|
|
}
|
|
|
|
type EditorSettings struct {
|
|
BaseIndentSize int `raw:"baseIndentSize" config:"format.baseIndentSize"`
|
|
IndentSize int `raw:"indentSize" config:"format.indentSize"`
|
|
TabSize int `raw:"tabSize" config:"format.tabSize"`
|
|
NewLineCharacter string `raw:"newLineCharacter" config:"format.newLineCharacter"`
|
|
ConvertTabsToSpaces core.Tristate `raw:"convertTabsToSpaces" config:"format.convertTabsToSpaces"`
|
|
IndentStyle IndentStyle `raw:"indentStyle" config:"format.indentStyle"`
|
|
TrimTrailingWhitespace core.Tristate `raw:"trimTrailingWhitespace" config:"format.trimTrailingWhitespace"`
|
|
}
|
|
|
|
type FormatCodeSettings struct {
|
|
EditorSettings
|
|
InsertSpaceAfterCommaDelimiter core.Tristate `raw:"insertSpaceAfterCommaDelimiter" config:"format.insertSpaceAfterCommaDelimiter"`
|
|
InsertSpaceAfterSemicolonInForStatements core.Tristate `raw:"insertSpaceAfterSemicolonInForStatements" config:"format.insertSpaceAfterSemicolonInForStatements"`
|
|
InsertSpaceBeforeAndAfterBinaryOperators core.Tristate `raw:"insertSpaceBeforeAndAfterBinaryOperators" config:"format.insertSpaceBeforeAndAfterBinaryOperators"`
|
|
InsertSpaceAfterConstructor core.Tristate `raw:"insertSpaceAfterConstructor" config:"format.insertSpaceAfterConstructor"`
|
|
InsertSpaceAfterKeywordsInControlFlowStatements core.Tristate `raw:"insertSpaceAfterKeywordsInControlFlowStatements" config:"format.insertSpaceAfterKeywordsInControlFlowStatements"`
|
|
InsertSpaceAfterFunctionKeywordForAnonymousFunctions core.Tristate `raw:"insertSpaceAfterFunctionKeywordForAnonymousFunctions" config:"format.insertSpaceAfterFunctionKeywordForAnonymousFunctions"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis" config:"format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets" config:"format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces" config:"format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingEmptyBraces core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingEmptyBraces" config:"format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces" config:"format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"`
|
|
InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces core.Tristate `raw:"insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces" config:"format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"`
|
|
InsertSpaceAfterTypeAssertion core.Tristate `raw:"insertSpaceAfterTypeAssertion" config:"format.insertSpaceAfterTypeAssertion"`
|
|
InsertSpaceBeforeFunctionParenthesis core.Tristate `raw:"insertSpaceBeforeFunctionParenthesis" config:"format.insertSpaceBeforeFunctionParenthesis"`
|
|
PlaceOpenBraceOnNewLineForFunctions core.Tristate `raw:"placeOpenBraceOnNewLineForFunctions" config:"format.placeOpenBraceOnNewLineForFunctions"`
|
|
PlaceOpenBraceOnNewLineForControlBlocks core.Tristate `raw:"placeOpenBraceOnNewLineForControlBlocks" config:"format.placeOpenBraceOnNewLineForControlBlocks"`
|
|
InsertSpaceBeforeTypeAnnotation core.Tristate `raw:"insertSpaceBeforeTypeAnnotation" config:"format.insertSpaceBeforeTypeAnnotation"`
|
|
IndentMultiLineObjectLiteralBeginningOnBlankLine core.Tristate `raw:"indentMultiLineObjectLiteralBeginningOnBlankLine" config:"format.indentMultiLineObjectLiteralBeginningOnBlankLine"`
|
|
Semicolons SemicolonPreference `raw:"semicolons" config:"format.semicolons"`
|
|
IndentSwitchCase core.Tristate `raw:"indentSwitchCase" config:"format.indentSwitchCase"`
|
|
}
|
|
|
|
func FromLSFormatOptions(f FormatCodeSettings, opt *lsproto.FormattingOptions) FormatCodeSettings {
|
|
updatedSettings := f
|
|
updatedSettings.TabSize = int(opt.TabSize)
|
|
updatedSettings.IndentSize = int(opt.TabSize)
|
|
updatedSettings.ConvertTabsToSpaces = core.BoolToTristate(opt.InsertSpaces)
|
|
if opt.TrimTrailingWhitespace != nil {
|
|
updatedSettings.TrimTrailingWhitespace = core.BoolToTristate(*opt.TrimTrailingWhitespace)
|
|
}
|
|
return updatedSettings
|
|
}
|
|
|
|
func (settings FormatCodeSettings) ToLSFormatOptions() *lsproto.FormattingOptions {
|
|
trimTrailingWhitespace := settings.TrimTrailingWhitespace.IsTrue()
|
|
return &lsproto.FormattingOptions{
|
|
TabSize: uint32(settings.TabSize),
|
|
InsertSpaces: settings.ConvertTabsToSpaces.IsTrue(),
|
|
TrimTrailingWhitespace: &trimTrailingWhitespace,
|
|
}
|
|
}
|
|
|
|
func GetDefaultFormatCodeSettings() FormatCodeSettings {
|
|
return FormatCodeSettings{
|
|
EditorSettings: EditorSettings{
|
|
IndentSize: printer.GetDefaultIndentSize(),
|
|
TabSize: printer.GetDefaultIndentSize(),
|
|
NewLineCharacter: "\n",
|
|
ConvertTabsToSpaces: core.TSTrue,
|
|
IndentStyle: IndentStyleSmart,
|
|
TrimTrailingWhitespace: core.TSTrue,
|
|
},
|
|
InsertSpaceAfterConstructor: core.TSFalse,
|
|
InsertSpaceAfterCommaDelimiter: core.TSTrue,
|
|
InsertSpaceAfterSemicolonInForStatements: core.TSTrue,
|
|
InsertSpaceBeforeAndAfterBinaryOperators: core.TSTrue,
|
|
InsertSpaceAfterKeywordsInControlFlowStatements: core.TSTrue,
|
|
InsertSpaceAfterFunctionKeywordForAnonymousFunctions: core.TSFalse,
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: core.TSFalse,
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: core.TSFalse,
|
|
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: core.TSTrue,
|
|
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: core.TSFalse,
|
|
InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: core.TSFalse,
|
|
InsertSpaceBeforeFunctionParenthesis: core.TSFalse,
|
|
PlaceOpenBraceOnNewLineForFunctions: core.TSFalse,
|
|
PlaceOpenBraceOnNewLineForControlBlocks: core.TSFalse,
|
|
Semicolons: SemicolonPreferenceIgnore,
|
|
IndentSwitchCase: core.TSTrue,
|
|
}
|
|
}
|