Skip to content

Commit

Permalink
[C2HEXA] Handle more types
Browse files Browse the repository at this point in the history
  • Loading branch information
PeyTy committed Jul 3, 2024
1 parent 44feb4e commit 17d1566
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 12 deletions.
72 changes: 64 additions & 8 deletions source/toHexa/clang/clangGenerator.hexa
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,21 @@ class ClangGenerator {
return text.toLowerCase()
}

return text.substr(0, 1).toLowerCase() + text.substr(1)
// `XXXyyy` to `xxxyyy`
let split = text.split('')
var at = 0
for char in split {
let lower = char.toLowerCase()
if lower != char {
at++
} else {
break
}
}

let final = text.substr(0, at).toLowerCase() + text.substr(at)

return reserved.includes(final)? final + 'Ref' : final
}

fun toPascalCase(text: String): String {
Expand All @@ -58,27 +72,65 @@ class ClangGenerator {

fun typeOfReturn(of ClangType) ClangType {
return {
qualType: of.qualType.split(' (')[0]
qualType: of.qualType.split('(') [0].trim()
}
}

fun typeToNodeType(qualType String) NodeType {
static let primitive = [
'Int8',
'Int16',
'Int32',
'Int64',

'UInt8',
'UInt16',
'UInt32',
'UInt64',

'Void'
// TODO
]

fun desugarKnownType(qualType String) String {
let qualType = desugarQualType.get(qualType) ?? qualType
let qualType = qualTypeToHexaType.get(qualType) ?? qualType
return qualType
}

fun typeToNodeType(qualType String) NodeType {
let qualType = desugarKnownType(qualType)

if qualType.startsWith('const ') and qualType.endsWith(' *') {
let clear = qualType.substring('const '.length, qualType.length - 1).trim()
let clear = desugarKnownType(clear)

if not primitive.includes(clear) {
return NodeType.Type(toPascalCase(clear), null)
}

return NodeType.ParametricType('ConstArrayPointer', [typeToNodeType(clear)], null)
}

if qualType.startsWith('struct ') and qualType.endsWith(' *') {
let clear = qualType.substring('struct '.length, qualType.length - 1).trim()
let clear = desugarKnownType(clear)
return NodeType.Type(toPascalCase(clear), null)
}

if qualType.endsWith(' *') {
let clear = qualType.substring(0, qualType.length - 1).trim()
let clear = desugarKnownType(clear)

if not primitive.includes(clear) {
return NodeType.Type(toPascalCase(clear), null)
}

return NodeType.ParametricType('ArrayPointer', [typeToNodeType(clear)], null)
}

if qualType.startsWith('struct ') and qualType.endsWith(' *') {
let clear = qualType.substring('struct '.length, qualType.length - 1).trim()
return NodeType.Type(toPascalCase(qualType), null)
if qualType.startsWith('const enum ') {
let clear = qualType.substring('const enum '.length, qualType.length - 0).trim()
return typeToNodeType(clear)
}

if qualType.startsWith('struct ') {
Expand All @@ -90,7 +142,7 @@ class ClangGenerator {
}

fun desugarType(of ClangType) String {
let name = of.desugaredQualType ?? of.qualType
let name = desugarQualType.get(of.qualType) ?? of.desugaredQualType ?? of.qualType

if name.endsWith('const') {
return name.substr(0, name.length - 'const'.length)
Expand Down Expand Up @@ -483,7 +535,11 @@ class ClangGenerator {
return name + '<' + params.map(t => NodeType.stringify(t)) + '>'
}
return name
case Int(s): return s.toString()
case Int(s):
if s > 2147483647 {
return s.toString() + 'u32'
}
return s.toString()
case Float(s): return s.toString()
case As(expr, kind, toType):
return `(` + stringify(expr) + ` as` + Token.stringify(kind) + ` ` + NodeType.stringify(toType) + `)`
Expand Down
35 changes: 31 additions & 4 deletions source/toHexa/clang/clangTree.hexa
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

enum ClangKind : String {
enum ClangKind: String {
IfStmt
DeclStmt
VarDecl
Expand Down Expand Up @@ -104,13 +104,40 @@ interface ClangNode {
}
}

let desugarQualType [String:String] = [
let desugarQualType [String: String] = [
'VOID': 'void',
'DWORD': 'unsigned long',
'INT': 'int',
'UINT': 'unsigned int',

'WORD': 'unsigned short'
]

let qualTypeToHexaType [String:String] = [
let qualTypeToHexaType [String: String] = [
'int': 'Int32',
// TODO size_t bool

'unsigned': 'UInt32',
'signed': 'Int32',
'unsigned int': 'UInt32',
'signed int': 'Int32',
'short': 'UInt16',
'unsigned long': 'UInt32',
'long': 'UInt32',
'unsigned short': 'UInt16',
'uint16_t': 'UInt16'
'unsigned char': 'UInt8',
'char': 'Int8',
'signed char': 'Int8',

'uint8_t': 'UInt8',
'uint16_t': 'UInt16',
'uint32_t': 'UInt32',
'uint64_t': 'UInt64',

'int8_t': 'Int8',
'int16_t': 'Int16',
'int32_t': 'Int32', // TODO just Int?
'int64_t': 'Int64',

'void': 'Void'
]

0 comments on commit 17d1566

Please sign in to comment.