no_mixed_enums

package
v0.1.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 11, 2025 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var NoMixedEnumsRule = rule.CreateRule(rule.Rule{
	Name: "no-mixed-enums",
	Run: func(ctx rule.RuleContext, options any) rule.RuleListeners {
		getMemberType := func(node *ast.Node) allowedType {
			initializer := node.AsEnumMember().Initializer

			if initializer == nil {
				return allowedTypeNumber
			}

			switch initializer.Kind {
			case ast.KindNumericLiteral:
				return allowedTypeNumber
			case ast.KindStringLiteral:
				return allowedTypeString
			default:
				t := ctx.TypeChecker.GetTypeAtLocation(initializer)
				if utils.IsTypeFlagSet(t, checker.TypeFlagsStringLike) {
					return allowedTypeString
				}
				if utils.IsTypeFlagSet(t, checker.TypeFlagsNumberLike) {
					return allowedTypeNumber
				}
				return allowedTypeUnknown
			}
		}
		getDesiredTypeForDefinition := func(node *ast.Node) allowedType {
			symbol := ctx.TypeChecker.GetSymbolAtLocation(node.Name())

			declaration := symbol.Declarations[0]

			return getMemberType(declaration.Members()[0])
		}
		return rule.RuleListeners{
			ast.KindEnumDeclaration: func(node *ast.Node) {
				enum := node.AsEnumDeclaration()

				if len(enum.Members.Nodes) == 0 {
					return
				}

				desiredType := getDesiredTypeForDefinition(node)
				if desiredType == allowedTypeUnknown {
					return
				}

				for _, member := range enum.Members.Nodes {
					currentType := getMemberType(member)
					if currentType == allowedTypeUnknown {
						return
					}

					if currentType != desiredType {
						init := member.AsEnumMember().Initializer
						if init == nil {
							init = member
						}
						ctx.ReportNode(init, buildMixedMessage())
						return
					}
				}
			},
		}
	},
})

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL