moonlight-pale-0.1.0.0: src-ghc-surface/Moonlight/Pale/Ghc/Expr/Convert/Obstruction.hs
module Moonlight.Pale.Ghc.Expr.Convert.Obstruction
( UnsupportedDeclarationTag (..),
InstanceMethodObstructionCause (..),
InstanceMethodObstruction (..),
RecordWildcardResolutionFailure (..),
ConvertObstruction (..),
recoverableInstanceMethodObstruction,
)
where
import Data.Kind (Type)
import GHC.Types.Name.Occurrence (occNameString)
import GHC.Types.Name.Reader (RdrName, rdrNameOcc)
import Moonlight.Core (BinderId)
import Moonlight.Pale.Ghc.Expr.Convert.Dependencies
( BindingDependencyFailure,
)
import Moonlight.Pale.Ghc.Expr.Scope
( ScopeId,
ScopeIdFailure,
ScopeIndexFailure,
)
import Moonlight.Pale.Ghc.Expr.Syntax (SourceRegion)
import Moonlight.Pale.Ghc.Expr.Opaque (HsOpaqueTag, HsPatOpaqueTag)
import Moonlight.Pale.Ghc.ModuleSurface (GhcParseFailure)
type UnsupportedDeclarationTag :: Type
data UnsupportedDeclarationTag
= UnsupportedTypeOrClassDeclaration
| UnsupportedTypeFamilyInstanceDeclaration
| UnsupportedDataFamilyInstanceDeclaration
| UnsupportedDerivingDeclaration
| UnsupportedKindSignatureDeclaration
| UnsupportedDefaultDeclaration
| UnsupportedForeignDeclaration
| UnsupportedWarningDeclaration
| UnsupportedAnnotationDeclaration
| UnsupportedRuleDeclaration
| UnsupportedSpliceDeclaration
| UnsupportedDocumentationDeclaration
| UnsupportedRoleAnnotationDeclaration
| UnsupportedPatternSynonymSignature
| UnsupportedClassOperationSignature
| UnsupportedInlineSignature
| UnsupportedSpecializationSignature
| UnsupportedExpressionSpecializationSignature
| UnsupportedInstanceSpecializationSignature
| UnsupportedMinimalSignature
| UnsupportedCostCentreSignature
| UnsupportedCompleteMatchSignature
deriving stock (Eq, Ord, Show, Enum, Bounded)
type InstanceMethodObstructionCause :: Type
data InstanceMethodObstructionCause
= InstanceMethodUnsupportedBinding !(Maybe SourceRegion) !String
| InstanceMethodUnsupportedExpression !(Maybe SourceRegion) !HsOpaqueTag
| InstanceMethodUnsupportedPattern !(Maybe SourceRegion) !HsPatOpaqueTag
deriving stock (Eq, Ord, Show)
type InstanceMethodObstruction :: Type
data InstanceMethodObstruction = InstanceMethodObstruction
{ instanceMethodObstructionRegion :: !(Maybe SourceRegion),
instanceMethodObstructionCause :: !InstanceMethodObstructionCause
}
deriving stock (Eq, Ord, Show)
type RecordWildcardResolutionFailure :: Type
data RecordWildcardResolutionFailure
= RecordWildcardConstructorUnavailable !RdrName
| RecordWildcardConstructorAmbiguous !RdrName
deriving stock (Eq, Ord)
instance Show RecordWildcardResolutionFailure where
show = \case
RecordWildcardConstructorUnavailable constructorName ->
"RecordWildcardConstructorUnavailable "
<> occNameString (rdrNameOcc constructorName)
RecordWildcardConstructorAmbiguous constructorName ->
"RecordWildcardConstructorAmbiguous "
<> occNameString (rdrNameOcc constructorName)
type ConvertObstruction :: Type
data ConvertObstruction
= ConvertParseFailure !GhcParseFailure
| ConvertScopeIndexFailure !ScopeIndexFailure
| ConvertFreshScopeIdFailure !Int !ScopeIdFailure
| ConvertMissingScopeDepth !ScopeId
| ConvertMissingBinderIntro !BinderId
| ConvertMissingScopeSummaryDepth !ScopeId
| ConvertBindingDependencyFailure !BindingDependencyFailure
| ConvertUnsupportedTopLevelBinding !(Maybe SourceRegion) !String
| ConvertDeclarationSourceUnavailable !(Maybe SourceRegion) !UnsupportedDeclarationTag
| ConvertInstanceDeclarationSourceUnavailable !(Maybe SourceRegion)
| ConvertRecordWildcardResolutionUnavailable !SourceRegion !RecordWildcardResolutionFailure
| ConvertRecordWildcardPositionInvalid !SourceRegion !Int !Int
| ConvertRecordWildcardRegionUnavailable !(Maybe SourceRegion)
| ConvertEmptyTypeSignature !(Maybe SourceRegion)
| ConvertEmptyFixityDeclaration !(Maybe SourceRegion)
| ConvertUnsupportedExpression !(Maybe SourceRegion) !HsOpaqueTag
| ConvertUnsupportedPattern !(Maybe SourceRegion) !HsPatOpaqueTag
deriving stock (Eq, Ord, Show)
recoverableInstanceMethodObstruction ::
Maybe SourceRegion ->
ConvertObstruction ->
Maybe InstanceMethodObstruction
recoverableInstanceMethodObstruction methodRegion = \case
ConvertUnsupportedTopLevelBinding obstructionRegion bindingShape ->
Just
InstanceMethodObstruction
{ instanceMethodObstructionRegion = methodRegion,
instanceMethodObstructionCause =
InstanceMethodUnsupportedBinding obstructionRegion bindingShape
}
ConvertUnsupportedExpression obstructionRegion expressionTag ->
Just
InstanceMethodObstruction
{ instanceMethodObstructionRegion = methodRegion,
instanceMethodObstructionCause =
InstanceMethodUnsupportedExpression obstructionRegion expressionTag
}
ConvertUnsupportedPattern obstructionRegion patternTag ->
Just
InstanceMethodObstruction
{ instanceMethodObstructionRegion = methodRegion,
instanceMethodObstructionCause =
InstanceMethodUnsupportedPattern obstructionRegion patternTag
}
ConvertParseFailure {} ->
Nothing
ConvertScopeIndexFailure {} ->
Nothing
ConvertFreshScopeIdFailure {} ->
Nothing
ConvertMissingScopeDepth {} ->
Nothing
ConvertMissingBinderIntro {} ->
Nothing
ConvertMissingScopeSummaryDepth {} ->
Nothing
ConvertBindingDependencyFailure {} ->
Nothing
ConvertDeclarationSourceUnavailable {} ->
Nothing
ConvertInstanceDeclarationSourceUnavailable {} ->
Nothing
ConvertRecordWildcardResolutionUnavailable {} ->
Nothing
ConvertRecordWildcardPositionInvalid {} ->
Nothing
ConvertRecordWildcardRegionUnavailable {} ->
Nothing
ConvertEmptyTypeSignature {} ->
Nothing
ConvertEmptyFixityDeclaration {} ->
Nothing