summaryrefslogtreecommitdiff
path: root/testsuite/tests/simplCore/should_run/T3972A.hs
blob: b8202f7448a5185e533a1136319969b2d6999d1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

module T3972A (Expr(..), Token(..), spanning, getSpan) where

class Span a where
   getSpan :: a -> SrcSpan

spanning :: (Span a, Span b) => a -> b -> SrcSpan
spanning x y = combineSrcSpans (getSpan x) (getSpan y)

instance Span a => Span [a] where
   getSpan [] = error "[]"
   getSpan [x] = getSpan x
   getSpan list@(x:_) = combineSrcSpans (getSpan x) (getSpan (last list))

data SrcSpan

  = SpanMultiLine
    { span_start_row    :: !Int
    , span_start_column :: !Int
    , span_end_row      :: !Int
    , span_end_column   :: !Int
    }

combineSrcSpans :: SrcSpan -> SrcSpan -> SrcSpan
combineSrcSpans start end
 = case row1 `compare` row2 of
     LT -> SpanMultiLine row1 col1 row2 col2
     _  -> SpanMultiLine row2 col2 row1 col1
  where
  row1 = startRow start
  col1 = startCol start
  row2 = endRow end
  col2 = endCol end


startRow :: SrcSpan -> Int
startRow (SpanMultiLine { span_start_row = row }) = row

endRow :: SrcSpan -> Int
endRow (SpanMultiLine { span_end_row = row }) = row

startCol :: SrcSpan -> Int
startCol (SpanMultiLine { span_start_column = col }) = col

endCol :: SrcSpan -> Int
endCol (SpanMultiLine { span_end_column = col }) = col

data Token
   = T10 { token_SrcSpan :: SrcSpan }
   | T11 { token_SrcSpan :: SrcSpan }
   | T12 { token_SrcSpan :: SrcSpan }
   | T13 { token_SrcSpan :: SrcSpan }
   | T14 { token_SrcSpan :: SrcSpan }
   | T15 { token_SrcSpan :: SrcSpan }
   | T16 { token_SrcSpan :: SrcSpan }
   | T17 { token_SrcSpan :: SrcSpan }
   | T18 { token_SrcSpan :: SrcSpan }
   | T19 { token_SrcSpan :: SrcSpan }
   | T20 { token_SrcSpan :: SrcSpan }
   | T21 { token_SrcSpan :: SrcSpan }
   | T22 { token_SrcSpan :: SrcSpan }
   | T23 { token_SrcSpan :: SrcSpan }
   | T24 { token_SrcSpan :: SrcSpan }

instance Span Token where
  getSpan = token_SrcSpan

data Expr
   = E10 { expr_SrcSpan :: SrcSpan }
   | E11 { expr_SrcSpan :: SrcSpan }
   | E12 { expr_SrcSpan :: SrcSpan }
   | E13 { expr_SrcSpan :: SrcSpan }
   | E14 { expr_SrcSpan :: SrcSpan }
   | E15 { expr_SrcSpan :: SrcSpan }
   | E16 { expr_SrcSpan :: SrcSpan }
   | E17 { expr_SrcSpan :: SrcSpan }
   | E18 { expr_SrcSpan :: SrcSpan }
   | E19 { expr_SrcSpan :: SrcSpan }
   | E20 { expr_SrcSpan :: SrcSpan }
   | E21 { expr_SrcSpan :: SrcSpan }
   | E22 { expr_SrcSpan :: SrcSpan }
   | E23 { expr_SrcSpan :: SrcSpan }
   | E24 { expr_SrcSpan :: SrcSpan }

instance Span Expr where
   getSpan = expr_SrcSpan