fix(fstab): Improvements; Bugfixes

This commit is contained in:
Myzel394 2024-10-09 14:41:40 +02:00
parent 30c68e0d99
commit 5a13487db8
No known key found for this signature in database
GPG Key ID: ED20A1D1D423AF3F
5 changed files with 178 additions and 140 deletions

View File

@ -16,11 +16,16 @@ func analyzeValuesAreValid(
for it.Next() {
entry := it.Value().(*ast.FstabEntry)
mountOptions := entry.FetchMountOptionsField(true)
checkField(ctx, entry.Fields.Spec, fields.SpecField)
checkField(ctx, entry.Fields.MountPoint, fields.MountPointField)
checkField(ctx, entry.Fields.FilesystemType, fields.FileSystemTypeField)
checkField(ctx, entry.Fields.Options, entry.GetMountOptionsField())
if mountOptions != nil {
checkField(ctx, entry.Fields.Options, mountOptions)
}
checkField(ctx, entry.Fields.Freq, fields.FreqField)
checkField(ctx, entry.Fields.Pass, fields.PassField)
}
@ -34,8 +39,7 @@ func checkField(
invalidValues := docOption.DeprecatedCheckIsValid(field.Value.Value)
for _, invalidValue := range invalidValues {
err := docvalues.LSPErrorFromInvalidValue(field.Start.Line, *invalidValue)
err.ShiftCharacter(field.Start.Character)
err := docvalues.LSPErrorFromInvalidValue(field.Start.Line, *invalidValue).ShiftCharacter(field.Start.Character)
ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{
Range: err.Range.ToLSPRange(),

View File

@ -4,6 +4,7 @@ import (
"config-lsp/common"
docvalues "config-lsp/doc-values"
"config-lsp/handlers/fstab/fields"
"config-lsp/utils"
)
// func (c FstabConfig) GetEntry(line uint32) *FstabEntry {
@ -40,16 +41,44 @@ func (e FstabEntry) GetFieldAtPosition(position common.Position) FstabFieldName
return FstabFieldPass
}
func (e FstabEntry) GetMountOptionsField() docvalues.DeprecatedValue {
fileSystemType := e.Fields.FilesystemType.Value.Value
var optionsField docvalues.DeprecatedValue
if foundField, found := fields.MountOptionsMapField[fileSystemType]; found {
optionsField = foundField
} else {
optionsField = fields.DefaultMountOptionsField
// Create a mount options field for the entry
func (e FstabEntry) FetchMountOptionsField(includeDefaults bool) docvalues.DeprecatedValue {
if e.Fields.FilesystemType == nil {
return nil
}
return optionsField
option, found := fields.MountOptionsMapField[e.Fields.FilesystemType.Value.Value]
if !found {
return nil
}
var enums []docvalues.EnumString
var assignable map[docvalues.EnumString]docvalues.DeprecatedValue
if includeDefaults {
enums = append(option.Enums, fields.DefaultOptions...)
assignable = utils.MergeMaps(option.Assignable, fields.DefaultAssignOptions)
} else {
enums = option.Enums
assignable = option.Assignable
}
return &docvalues.ArrayValue{
Separator: ",",
DuplicatesExtractor: &fields.MountOptionsExtractor,
SubValue: docvalues.OrValue{
Values: []docvalues.DeprecatedValue{
docvalues.KeyEnumAssignmentValue{
Values: assignable,
ValueIsOptional: false,
Separator: "=",
},
docvalues.EnumValue{
EnforceValues: true,
Values: enums,
},
},
},
}
}

View File

@ -6,7 +6,7 @@ import (
"strings"
)
var mountOptionsExtractor = func(value string) string {
var MountOptionsExtractor = func(value string) string {
separatorIndex := strings.Index(value, "=")
if separatorIndex == -1 {
@ -17,7 +17,7 @@ var mountOptionsExtractor = func(value string) string {
}
// From https://www.man7.org/linux/man-pages/man8/mount.8.html
var defaultOptions = []docvalues.EnumString{
var DefaultOptions = []docvalues.EnumString{
// Default options
docvalues.CreateEnumStringWithDoc(
"async",
@ -228,7 +228,7 @@ type assignOption struct {
Handler func(context docvalues.KeyValueAssignmentContext) docvalues.DeprecatedValue
}
var defaultAssignOptions = map[docvalues.EnumString]docvalues.DeprecatedValue{
var DefaultAssignOptions = map[docvalues.EnumString]docvalues.DeprecatedValue{
docvalues.CreateEnumStringWithDoc(
"context",
"The context= option is useful when mounting filesystems that do not support extended attributes, such as a floppy or hard disk formatted with VFAT, or systems that are not normally running under SELinux, such as an ext3 or ext4 formatted disk from a non-SELinux workstation. You can also use context= on filesystems you do not trust, such as a floppy. It also helps in compatibility with xattr-supporting filesystems on earlier 2.4.<x> kernel versions. Even where xattrs are supported, you can save time not having to label every file by assigning the entire disk one security context. A commonly used option for removable media is context=\"system_u:object_r:removable_t\".",
@ -347,7 +347,7 @@ func createMountOptionField(
return docvalues.ArrayValue{
Separator: ",",
DuplicatesExtractor: &mountOptionsExtractor,
DuplicatesExtractor: &MountOptionsExtractor,
SubValue: docvalues.OrValue{
Values: []docvalues.DeprecatedValue{
docvalues.KeyEnumAssignmentValue{
@ -364,103 +364,114 @@ func createMountOptionField(
}
}
var DefaultMountOptionsField = createMountOptionField(defaultOptions, defaultAssignOptions)
var MountOptionsMapField = map[string]docvalues.DeprecatedValue{
"adfs": createMountOptionField(
commondocumentation.AdfsDocumentationEnums,
commondocumentation.AdfsDocumentationAssignable,
),
"affs": createMountOptionField(
commondocumentation.AffsDocumentationEnums,
commondocumentation.AffsDocumentationAssignable,
),
"btrfs": createMountOptionField(
commondocumentation.BtrfsDocumentationEnums,
commondocumentation.BtrfsDocumentationAssignable,
),
"debugfs": createMountOptionField(
commondocumentation.DebugfsDocumentationEnums,
commondocumentation.DebugfsDocumentationAssignable,
),
"ext2": createMountOptionField(
commondocumentation.Ext2DocumentationEnums,
commondocumentation.Ext2DocumentationAssignable,
),
"ext3": createMountOptionField(
append(commondocumentation.Ext2DocumentationEnums, commondocumentation.Ext3DocumentationEnums...),
docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext2DocumentationAssignable, commondocumentation.Ext3DocumentationAssignable),
),
"ext4": createMountOptionField(
append(append(commondocumentation.Ext2DocumentationEnums, commondocumentation.Ext3DocumentationEnums...), commondocumentation.Ext4DocumentationEnums...),
docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext2DocumentationAssignable, docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext3DocumentationAssignable, commondocumentation.Ext4DocumentationAssignable)),
),
"devpts": createMountOptionField(
commondocumentation.DevptsDocumentationEnums,
commondocumentation.DevptsDocumentationAssignable,
),
"fat": createMountOptionField(
commondocumentation.FatDocumentationEnums,
commondocumentation.FatDocumentationAssignable,
),
"hfs": createMountOptionField(
commondocumentation.HfsDocumentationEnums,
commondocumentation.HfsDocumentationAssignable,
),
"hpfs": createMountOptionField(
commondocumentation.HpfsDocumentationEnums,
commondocumentation.HpfsDocumentationAssignable,
),
"iso9660": createMountOptionField(
commondocumentation.Iso9660DocumentationEnums,
commondocumentation.Iso9660DocumentationAssignable,
),
"jfs": createMountOptionField(
commondocumentation.JfsDocumentationEnums,
commondocumentation.JfsDocumentationAssignable,
),
"msdos": createMountOptionField(
commondocumentation.MsdosDocumentationEnums,
commondocumentation.MsdosDocumentationAssignable,
),
"ncpfs": createMountOptionField(
commondocumentation.NcpfsDocumentationEnums,
commondocumentation.NcpfsDocumentationAssignable,
),
"ntfs": createMountOptionField(
commondocumentation.NtfsDocumentationEnums,
commondocumentation.NtfsDocumentationAssignable,
),
"overlay": createMountOptionField(
commondocumentation.OverlayDocumentationEnums,
commondocumentation.OverlayDocumentationAssignable,
),
"reiserfs": createMountOptionField(
commondocumentation.ReiserfsDocumentationEnums,
commondocumentation.ReiserfsDocumentationAssignable,
),
"usbfs": createMountOptionField(
commondocumentation.UsbfsDocumentationEnums,
commondocumentation.UsbfsDocumentationAssignable,
),
"ubifs": createMountOptionField(
commondocumentation.UbifsDocumentationEnums,
commondocumentation.UbifsDocumentationAssignable,
),
"udf": createMountOptionField(
commondocumentation.UdfDocumentationEnums,
commondocumentation.UdfDocumentationAssignable,
),
"ufs": createMountOptionField(
commondocumentation.UfsDocumentationEnums,
commondocumentation.UfsDocumentationAssignable,
),
"umsdos": createMountOptionField(
commondocumentation.UmsdosDocumentationEnums,
commondocumentation.UmsdosDocumentationAssignable,
),
"vfat": createMountOptionField(
commondocumentation.VfatDocumentationEnums,
commondocumentation.VfatDocumentationAssignable,
),
type optionField struct {
Assignable map[docvalues.EnumString]docvalues.DeprecatedValue
Enums []docvalues.EnumString
}
var DefaultMountOptionsField = createMountOptionField(DefaultOptions, DefaultAssignOptions)
var MountOptionsMapField = map[string]optionField{
"adfs": {
Enums: commondocumentation.AdfsDocumentationEnums,
Assignable: commondocumentation.AdfsDocumentationAssignable,
},
"affs": {
Enums: commondocumentation.AffsDocumentationEnums,
Assignable: commondocumentation.AffsDocumentationAssignable,
},
"btrfs": {
Enums: commondocumentation.BtrfsDocumentationEnums,
Assignable: commondocumentation.BtrfsDocumentationAssignable,
},
"debugfs": {
Enums: commondocumentation.DebugfsDocumentationEnums,
Assignable: commondocumentation.DebugfsDocumentationAssignable,
},
"ext2": {
Enums: commondocumentation.Ext2DocumentationEnums,
Assignable: commondocumentation.Ext2DocumentationAssignable,
},
"ext3": {
Enums: append(commondocumentation.Ext2DocumentationEnums, commondocumentation.Ext3DocumentationEnums...),
Assignable: docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext2DocumentationAssignable, commondocumentation.Ext3DocumentationAssignable),
},
"ext4": {
Enums: append(
append(
commondocumentation.Ext2DocumentationEnums,
commondocumentation.Ext3DocumentationEnums...,
),
commondocumentation.Ext4DocumentationEnums...,
),
Assignable: docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext2DocumentationAssignable, docvalues.MergeKeyEnumAssignmentMaps(commondocumentation.Ext3DocumentationAssignable, commondocumentation.Ext4DocumentationAssignable)),
},
"devpts": {
Enums: commondocumentation.DevptsDocumentationEnums,
Assignable: commondocumentation.DevptsDocumentationAssignable,
},
"fat": {
Enums: commondocumentation.FatDocumentationEnums,
Assignable: commondocumentation.FatDocumentationAssignable,
},
"hfs": {
Enums: commondocumentation.HfsDocumentationEnums,
Assignable: commondocumentation.HfsDocumentationAssignable,
},
"hpfs": {
Enums: commondocumentation.HpfsDocumentationEnums,
Assignable: commondocumentation.HpfsDocumentationAssignable,
},
"iso9660": {
Enums: commondocumentation.Iso9660DocumentationEnums,
Assignable: commondocumentation.Iso9660DocumentationAssignable,
},
"jfs": {
Enums: commondocumentation.JfsDocumentationEnums,
Assignable: commondocumentation.JfsDocumentationAssignable,
},
"msdos": {
Enums: commondocumentation.MsdosDocumentationEnums,
Assignable: commondocumentation.MsdosDocumentationAssignable,
},
"ncpfs": {
Enums: commondocumentation.NcpfsDocumentationEnums,
Assignable: commondocumentation.NcpfsDocumentationAssignable,
},
"ntfs": {
Enums: commondocumentation.NtfsDocumentationEnums,
Assignable: commondocumentation.NtfsDocumentationAssignable,
},
"overlay": {
Enums: commondocumentation.OverlayDocumentationEnums,
Assignable: commondocumentation.OverlayDocumentationAssignable,
},
"reiserfs": {
Enums: commondocumentation.ReiserfsDocumentationEnums,
Assignable: commondocumentation.ReiserfsDocumentationAssignable,
},
"usbfs": {
Enums: commondocumentation.UsbfsDocumentationEnums,
Assignable: commondocumentation.UsbfsDocumentationAssignable,
},
"ubifs": {
Enums: commondocumentation.UbifsDocumentationEnums,
Assignable: commondocumentation.UbifsDocumentationAssignable,
},
"udf": {
Enums: commondocumentation.UdfDocumentationEnums,
Assignable: commondocumentation.UdfDocumentationAssignable,
},
"ufs": {
Enums: commondocumentation.UfsDocumentationEnums,
Assignable: commondocumentation.UfsDocumentationAssignable,
},
"umsdos": {
Enums: commondocumentation.UmsdosDocumentationEnums,
Assignable: commondocumentation.UmsdosDocumentationAssignable,
},
"vfat": {
Enums: commondocumentation.VfatDocumentationEnums,
Assignable: commondocumentation.VfatDocumentationAssignable,
},
}

View File

@ -42,6 +42,7 @@ func GetCompletion(
fileSystemType := entry.Fields.FilesystemType.Value.Value
completions := make([]protocol.CompletionItem, 0, 50)
println("fetching field options now", line, cursor)
for _, completion := range fields.DefaultMountOptionsField.DeprecatedFetchCompletions(line, cursor) {
var documentation string
@ -59,23 +60,21 @@ func GetCompletion(
completions = append(completions, completion)
}
if optionsField, found := fields.MountOptionsMapField[fileSystemType]; found {
for _, completion := range optionsField.DeprecatedFetchCompletions(line, cursor) {
var documentation string
for _, completion := range entry.FetchMountOptionsField(false).DeprecatedFetchCompletions(line, cursor) {
var documentation string
switch completion.Documentation.(type) {
case string:
documentation = completion.Documentation.(string)
case *string:
documentation = *completion.Documentation.(*string)
}
completion.Documentation = protocol.MarkupContent{
Kind: protocol.MarkupKindMarkdown,
Value: documentation + "\n\n" + fmt.Sprintf("From: _%s_", fileSystemType),
}
completions = append(completions, completion)
switch completion.Documentation.(type) {
case string:
documentation = completion.Documentation.(string)
case *string:
documentation = *completion.Documentation.(*string)
}
completion.Documentation = protocol.MarkupContent{
Kind: protocol.MarkupKindMarkdown,
Value: documentation + "\n\n" + fmt.Sprintf("From: _%s_", fileSystemType),
}
completions = append(completions, completion)
}
return completions, nil
@ -109,5 +108,5 @@ func getFieldSafely(field *ast.FstabField, cursor common.CursorPosition) (string
return "", 0
}
return field.Value.Raw, common.CursorToCharacterIndex(uint32(cursor)) - field.Start.Character
return field.Value.Raw, common.CursorToCharacterIndex(uint32(cursor) - field.Start.Character)
}

View File

@ -2,9 +2,7 @@ package handlers
import (
"config-lsp/common"
"config-lsp/doc-values"
"config-lsp/handlers/fstab/ast"
"config-lsp/handlers/fstab/fields"
"strings"
"github.com/tliron/glsp/protocol_3_16"
@ -25,13 +23,10 @@ func GetHoverInfo(
case ast.FstabFieldFileSystemType:
return &FileSystemTypeField, nil
case ast.FstabFieldOptions:
fileSystemType := entry.Fields.FilesystemType.Value.Value
var optionsField docvalues.DeprecatedValue
optionsField := entry.FetchMountOptionsField(true)
if foundField, found := fields.MountOptionsMapField[fileSystemType]; found {
optionsField = foundField
} else {
optionsField = fields.DefaultMountOptionsField
if optionsField == nil {
return nil, nil
}
relativeCursor := uint32(index) - entry.Fields.Options.Start.Character