mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-31 16:07:44 +03:00 
			
		
		
		
	Properly ignore core types when generating code
This commit is contained in:
		
							parent
							
								
									e8cdcf369d
								
							
						
					
					
						commit
						0e45f46ad5
					
				|  | @ -232,12 +232,6 @@ P.S.: I may have lied a bit. The ``TL`` language is not that easy. But it's not | ||||||
| You're free to sniff the ``parser/`` files and learn how to parse other more complex lines. | You're free to sniff the ``parser/`` files and learn how to parse other more complex lines. | ||||||
| Or simply use that code and change the `SourceBuilder <telethon_generator/parser/source_builder.py>`_! | Or simply use that code and change the `SourceBuilder <telethon_generator/parser/source_builder.py>`_! | ||||||
| 
 | 
 | ||||||
| Notes about the code generator |  | ||||||
| ------------------------------ |  | ||||||
| The code generator will skip the types considered as *core types*. These types are usually included in |  | ||||||
| almost every programming language, such as boolean values or lists, and also the Telegram True flag, |  | ||||||
| which is *not* sent but rather used to determine whether that flag should be enabled or not. |  | ||||||
| 
 |  | ||||||
| Updating the ``scheme.tl`` | Updating the ``scheme.tl`` | ||||||
| -------------------------- | -------------------------- | ||||||
| Have you found a more updated version of the ``scheme.tl`` file? Those are great news! Updating is as simple | Have you found a more updated version of the ``scheme.tl`` file? Those are great news! Updating is as simple | ||||||
|  |  | ||||||
|  | @ -4,7 +4,12 @@ from zlib import crc32 | ||||||
| 
 | 
 | ||||||
| class TLObject: | class TLObject: | ||||||
|     """.tl core types IDs (such as vector, booleans, etc.)""" |     """.tl core types IDs (such as vector, booleans, etc.)""" | ||||||
|     CORE_TYPES = (0x1cb5c415, 0xbc799737, 0x997275b5, 0x3fedd339) |     CORE_TYPES = ( | ||||||
|  |         0xbc799737,  # boolFalse#bc799737 = Bool; | ||||||
|  |         0x997275b5,  # boolTrue#997275b5 = Bool; | ||||||
|  |         0x3fedd339,  # true#3fedd339 = True; | ||||||
|  |         0x1cb5c415,  # vector#1cb5c415 {t:Type} # [ t ] = Vector t; | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     def __init__(self, fullname, object_id, args, result, is_function): |     def __init__(self, fullname, object_id, args, result, is_function): | ||||||
|         """ |         """ | ||||||
|  | @ -65,6 +70,10 @@ class TLObject: | ||||||
|             ;$                 # Finally, the line should always end with ; |             ;$                 # Finally, the line should always end with ; | ||||||
|             ''', tl, re.IGNORECASE | re.VERBOSE) |             ''', tl, re.IGNORECASE | re.VERBOSE) | ||||||
| 
 | 
 | ||||||
|  |         if match is None: | ||||||
|  |             # Probably "vector#1cb5c415 {t:Type} # [ t ] = Vector t;" | ||||||
|  |             raise ValueError('Cannot parse TLObject', tl) | ||||||
|  | 
 | ||||||
|         # Sub-regex to match the arguments (sadly, it cannot be embedded in the first regex) |         # Sub-regex to match the arguments (sadly, it cannot be embedded in the first regex) | ||||||
|         args_match = re.findall(r''' |         args_match = re.findall(r''' | ||||||
|             ({)?             # We may or may not capture the opening brace |             ({)?             # We may or may not capture the opening brace | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ class TLParser: | ||||||
|     """Class used to parse .tl files""" |     """Class used to parse .tl files""" | ||||||
| 
 | 
 | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def parse_file(file_path): |     def parse_file(file_path, ignore_core=False): | ||||||
|         """This method yields TLObjects from a given .tl file""" |         """This method yields TLObjects from a given .tl file""" | ||||||
| 
 | 
 | ||||||
|         with open(file_path, encoding='utf-8') as file: |         with open(file_path, encoding='utf-8') as file: | ||||||
|  | @ -28,7 +28,13 @@ class TLParser: | ||||||
|                         is_function = following_types == 'functions' |                         is_function = following_types == 'functions' | ||||||
| 
 | 
 | ||||||
|                     else: |                     else: | ||||||
|                         yield TLObject.from_tl(line, is_function) |                         try: | ||||||
|  |                             result = TLObject.from_tl(line, is_function) | ||||||
|  |                             if not ignore_core or not result.is_core_type(): | ||||||
|  |                                 yield result | ||||||
|  |                         except ValueError as e: | ||||||
|  |                             if 'vector#1cb5c415' not in str(e): | ||||||
|  |                                 raise | ||||||
| 
 | 
 | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def find_layer(file_path): |     def find_layer(file_path): | ||||||
|  |  | ||||||
|  | @ -128,12 +128,12 @@ contest.saveDeveloperInfo#9a5f6e95 vk_id:int name:string phone_number:string age | ||||||
| 
 | 
 | ||||||
| ---types--- | ---types--- | ||||||
| 
 | 
 | ||||||
| //boolFalse#bc799737 = Bool; | boolFalse#bc799737 = Bool; | ||||||
| //boolTrue#997275b5 = Bool; | boolTrue#997275b5 = Bool; | ||||||
| 
 | 
 | ||||||
| //true#3fedd339 = True; | true#3fedd339 = True; | ||||||
| 
 | 
 | ||||||
| //vector#1cb5c415 {t:Type} # [ t ] = Vector t; | vector#1cb5c415 {t:Type} # [ t ] = Vector t; | ||||||
| 
 | 
 | ||||||
| error#c4b9f9bb code:int text:string = Error; | error#c4b9f9bb code:int text:string = Error; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ class TLGenerator: | ||||||
|         os.makedirs(self._get_file('types'), exist_ok=True) |         os.makedirs(self._get_file('types'), exist_ok=True) | ||||||
| 
 | 
 | ||||||
|         # Step 0: Cache the parsed file on a tuple |         # Step 0: Cache the parsed file on a tuple | ||||||
|         tlobjects = tuple(TLParser.parse_file(scheme_file)) |         tlobjects = tuple(TLParser.parse_file(scheme_file, ignore_core=True)) | ||||||
| 
 | 
 | ||||||
|         # Step 1: Group everything by {namespace: [tlobjects]} so we can |         # Step 1: Group everything by {namespace: [tlobjects]} so we can | ||||||
|         # easily generate __init__.py files with all the TLObjects on them. |         # easily generate __init__.py files with all the TLObjects on them. | ||||||
|  | @ -138,10 +138,6 @@ class TLGenerator: | ||||||
| 
 | 
 | ||||||
|                 # Generate the class for every TLObject |                 # Generate the class for every TLObject | ||||||
|                 for t in sorted(tlobjects, key=lambda x: x.name): |                 for t in sorted(tlobjects, key=lambda x: x.name): | ||||||
|                     # Omit core types, they're embedded in the code |  | ||||||
|                     if t.is_core_type(): |  | ||||||
|                         continue |  | ||||||
| 
 |  | ||||||
|                     TLGenerator._write_source_code( |                     TLGenerator._write_source_code( | ||||||
|                         t, builder, depth, type_constructors |                         t, builder, depth, type_constructors | ||||||
|                     ) |                     ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user